2014-09-03 5 views
1

이전에 게시 한 비슷한 질문이 있지만 불행히도 내 문제에 대한 솔루션을 추정 할 수는 없습니다.동일한 테이블을 가리키는 두 개의 키가있는보기를 만드시겠습니까?

Train_Booking 테이블과 Train_Times 테이블이 있습니다. 열차 지휘자 당 모든 열차 예약을 보여주는보기를 만들고 싶습니다. 그러나 Train_Booking에는 두 개의 Train_Times 참조가 있습니다 : Train_Times 테이블을 가리키는 고유 외래 키를 보유하는 Train_Departure 및 Train_Arrival 필드.

내가 좋아하는 뷰를 만들려면 =

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) 및 ONE 다른 필드가 포함되어 있습니까? 두 개있는 것 같니? 따라서 outbound_time_ID와 inbound_time_ID는 둘 다 한 번에 한 번이 아닌 두 번 * 한 번에 연결됩니까? –

+0

데이터베이스 스키마를 추가 할 수 있습니까? – HamHamJ

+0

Train_Times는 Train_Time_ID, Train_Date 및 Train_Time을 포함하고 있지만이보기에서는 방금 날짜를 원했습니다. 감사합니다. – user2395608

답변

0

는 대신 한번의 두 번 Train_Time 테이블을 가입 할 수 있습니다. 상상해보십시오. 두 개의 Train_Times 테이블 복사본이있는 것처럼 생각하십시오. 하나는 인바운드에 가입하고 다른 하나는 아웃 바운드에 가입합니다. 실제로, 당신은 하나의 테이블 만 가지고 있지만 SQL은 여러 번 참여할 수있게 해줍니다. 매번 쿼리 내에서 고유 한 이름을 제공해야합니다. "질의 내에서 Train_Times 테이블의 이름으로"T1 "과"T2 "를 사용한다고 가정합니다.

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 

지휘자를 참조하고 싶으므로 여기에도 참여할 수 있습니다. 전체 검색어는 다음과 같습니다.

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

+1

"JOIN Train_Times AS InboundTime"이되어서는 안됩니까? – HamHamJ

+0

그 솔루션을 구현하려했지만 쿼리를 허용하지 않습니다. 구문을 조금 설명 할 수 있습니까? – user2395608

관련 문제