使用指向同一个表的两个键创建视图?

时间:2014-09-03 18:11:56

标签: mysql sql database

之前发布过一些类似的问题,但不幸的是,我不能从他们那里推断出我的问题的解决方案。

我有一个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

1 个答案:

答案 0 :(得分: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