2014-09-03 72 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