2011-03-02 2 views
1

SQL을 사용하여 두 테이블을 조인합니다. 나는 헌장 비행 정보를 포함하는 테이블과 배정 된 승무원을 포함하는 테이블에 합류하고 있습니다. 필자의 결과에서 필자는 승무원 테이블에 "조종사"라는 값만있는 행만 표시하고 "조종사"는 표시하지 않습니다.SQL JOIN은 특정 값이없는 행을 결과로 제한합니다.

+0

더 명확하게 이해할 수 있도록 테이블 구조를 게시하십시오. –

+0

@ Nija의 게시물을 사용해보십시오. 당신은 테이블 구조를 추가 할 수 있습니까? 당신은 내부 조인이 필요하고 @ Table = value를 사용하여 그것을 필터링해야합니다. – Crimsonland

+0

관련 ERD를 추가했습니다. –

답변

1

괜찮은 쿼리를 제공하기 위해 우리에게 스키마를 제공해야합니다. 제 생각에 가장 중요한 것은 조종사 및 부조종사가 누구인지 어떻게 판단 할 수 있으며 각 사람을 어떻게 비행과 관련 지을 수 있는지입니다.

나는 이런 식으로 뭔가 도움이 될 생각 :

SELECT * FROM Charter C 
INNER JOIN Crew ON (Charter.CHAR_TRIP = Crew.CHAR_TRIP) 
WHERE Crew.Crew_Job = 'PILOT' AND (SELECT COUNT(*) FROM Charter 
            INNER JOIN Crew ON (Charter.CHAR_TRIP = Crew.CHAR_TRIP) 
            WHERE Crew.Crew_Job = 'CoPilot' 
             AND Charter.Chart_Trip = C.ChartTrip) = 0 

이 깨끗한 솔루션이 아닐 수도 있지만 ..이 일을해야한다.

+0

관련 테이블에 대한 ERD를 추가했습니다. CREW_JOB에는 "Pilot"또는 "Copilot"이 포함됩니다. 나는 여행을위한 유일한 ID가 될 것 인 CHAR_TRIP 위에서 그들을 맺어 줄 것이다. –

3

SELECT * FROM TABLE_A JOIN TABLE_B ON (TABLE_A.Value = TABLE_B.Value) WHERE TABLE_A.OtherValue = 'Pilot'

이 내 머리 위로 떨어져있다

enter image description here

, 그래서 어떤 구문이 해제 될 수 있습니다. 요점은 WHERE 절입니다. 원하는 값을 지정할 수 있습니다 (귀하의 경우에는 Pilot을 찾고 있습니다).

편집 : 가치를 막으려면 WHERE TABLE.VALUE != 'Copilot'!=과 같이 할 수 있습니다.이 값은 어떤 SQL인지에 따라 <>으로 작성해야합니다.

EDIT2 : 내 SQL-Server는 멍청하고 연결이되지 않으므로 이것은 또한 내 머리 꼭대기에서 벗어나므로 조금은 해킹 일로 생각된다. 그러나 나는 그것이 일을 할 것이라고 생각한다. . :)
SELECT [CHARTER].*, COUNT(*) as Tally FROM [CHARTER] JOIN [CREW] ON ([CHARTER].[CHAR_TRIP] = [CREW].[CHAR_TRIP]) WHERE [CREW].[CREW_JOB] = 'PILOT' OR [CREW].[CREW_JOB] = 'COPILOT' GROUP BY [CHARTER].* HAVING Tally = 1
이것은 모든 비행편에 파일럿이 있다고 가정하지만 모든 비행에 부조종사가있는 것은 아닙니다. 원하는 정확한 디스플레이를 얻으려면 서브 쿼리 (Tally 열 제거)로 사용해야 할 수도 있습니다.

+0

예, 결과가 "파일럿"인 행으로 결과를 제한하고 싶습니다. 예를 들어, 특정 전세기 ID에 대한 파일럿 및 CoPilot이있는 경우 조종사 테이블에 부조종사 또는 조종사 및 부조종사 만있는 행이 필요합니다. –

2
SELECT * 
FROM charter ch 
JOIN crew cr ON ch.char_trip = cr.char_trip 
WHERE NOT EXISTS(SELECT * 
        FROM crew cr2 
        WHERE cr2.char_trip = ch.char_trip 
        AND cr2.crew_job != 'PILOT') 

트릭을해야한다고 생각합니다. 3 행의 승무원 테이블에 대한 조인은 선택 사항이며 해당 테이블의 결과가 필요한 경우에만 가능합니다. NOT EXISTS anti-join은 주어진 여행에 대한 모든 승무원을 평가하고 조종사가 아닌 것을 확인합니다.

관련 문제