2014-09-03 105 views
1

還有一些類似的問題,但我不能從我們的問題推斷解決方案,不幸的是他們。使用指向同一個表的兩個鍵創建視圖?

我有一個Train_Booking表和一個Train_Times表。我想創建一個視圖,顯示每個列車售票員的所有列車預訂情況。不過,我的Train_Booking在其中有兩個Train_Times引用:Train_Departure和Train_Arrival字段,它們持有指向Train_Times表的唯一外鍵。

我想創建像視圖=

CREATE VIEW Train_Bookings_By_Conductor AS SELECT Train_Booking.Train_Booking_ID, Conductor.Conductor_Name, Train_Times.Train_Departure_Date, Train_Times.Train_Arrival_Date 
FROM Train_Booking, Conductor, Train_Times 
WHERE (Train_Booking.Conductor_ID = Conductor.Conductor_ID) AND (Train_Booking.Train_Outbound_Time_ID = Train_Times.Train_Time_ID) 

我的問題是當然,該視圖顯示出發日期和到達日期作爲相同的。添加以下內容只是打破查詢

AND (Train_Booking.Train_Inbound_Time_ID = Train_Times.Train_Time_ID) 

任何人都可以請說明在這種情況下做什麼?如果我沒有正確指出問題,請道歉,我會相應地重寫它!由於

架構

enter image description here

+0

那麼,Train_Times包含(Train_Time_ID)和一個其他字段,或兩個?看起來有兩個?因此,outbound_time_ID和inbound_time_ID都與* pair *次數相關聯,而不僅僅是一次? – 2014-09-03 18:15:51

+0

你可以添加數據庫模式嗎? – HamHamJ 2014-09-03 18:17:39

+0

Train_Times包含Train_Time_ID,Train_Date和Train_Time,但對於這個視圖我只想要日期,謝謝。 – user2395608 2014-09-03 18:18:23

回答

0

你可以加入Train_Time表兩次,而不是一次。想象一下,就好像你有兩個Train_Times表副本。您加入一個入站,並加入另一個出站。實際上,你只有一個這樣的表,但SQL允許你多次連接。每次,您都必須提供一個在您的查詢中唯一的名稱。假設我們使用「T1」和「T2」作爲Train_Times表的名字(在我們的查詢中)。

您加入Train_times,將其稱爲「T2」並使用入站字段進行加入。然後,我們再次加入;這次將其稱爲「T2」並使用連接中的出站字段。你將會得到如下結果:

SELECT Train_Booking.Train_Booking_ID 
    ,T1.Train_Date as Arrival_Time 
    ,T2.Train_Date as Departure_Date 
FROM Train_Booking 
JOIN Train_Times T1 
    on Train_Booking.Train_Inbound_Time_ID = T1.Train_Time_ID 
JOIN Train_Times T2 
    on Train_Booking.Train_Outbound_Time_ID = T2.Train_Time_ID 

既然你想引用Conductor,你也可以加入到它。完整的查詢如下:

SELECT Train_Booking.Train_Booking_ID 
    ,Conductor.Conductor_Name 
    ,T1.Train_Date as Arrival_Time 
    ,T2.Train_Date as Departure_Date 
FROM Train_Booking 
JOIN Conductor 
    on Train_Booking.Conductor_ID = Conductor.Conductor_ID 
JOIN Train_Times T1 
    on Train_Booking.Train_Inbound_Time_ID = T1.Train_Time_ID 
JOIN Train_Times T2 
    on Train_Booking.Train_Outbound_Time_ID = T2.Train_Time_ID 

這種問題的一個有用的工具是SQlFiddle。而不是在問題中提供表格結構,你可以讓它「活」。例如,以下是您的查詢的實時示例:http://sqlfiddle.com/#!2/142a1/4

+0

我已經添加了模式的問題,但我認爲你的答案應該做的伎倆,生病的報告回來。 – user2395608 2014-09-03 18:33:47

+1

不應該是「加入Train_Times AS InboundTime」嗎? – HamHamJ 2014-09-03 18:36:05

+0

我試圖實現該解決方案,但它不會接受查詢 - 你能解釋一下這個語法嗎? – user2395608 2014-09-03 19:48:31