2011-05-12 5 views
0

나는 다음과 같은 열이있는 테이블 연결 및 위치를 가지고 :동일한 테이블을 여러 개 결합하는 방법은 무엇입니까?

연결 :

LocationIDFrom 
LocationIDTo 
Duration 

위치 :

LocationID 
LocationName 

예제 기록은 다음과 같다 : 연결 :

,756,933,737,039,043,210

위치 : 나는 열 LocationFrom, LocationTo, 시간과 함께 테이블을 표시하고 싶었

1, New York 
2, Boston 
3 Los Angeles 

. 기록에 대한 위의 예는 내가 다음 쿼리

SELECT l1.LocationName AS LocationFrom, l2.LocationName AS LocationTo, c.Duration 
FROM Connection c 
    INNER JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
    INNER JOIN Location l2 ON l2.LocationID= c.LocationIDTo 

을 사용하려고하지만 결과는 불완전

New York, Boston, 3ms 
Boston, New York, 5ms 
Los Angeles, Boston, 2ms 

것; 위치 정보가 LocationIDFrom 및 LocationIDTo에 대한 위치 테이블에 저장된 행이 누락되었습니다.

위 쿼리를 수정하거나 ID 대신 LocationFrom 및 LocationTo에 대해 동일한 테이블에서 검색해야하는 위치 이름이있는 테이블을 반환하는 올바른 방법을 아는 사람이 있습니까?

Here 비슷한 문제에 대한 해결책을 찾았지만 위에 설명 된 문제에 대한 원리가 왜 작동하지 않는지 알 수 없습니다.

+1

행이 누락 될 수있는 방법을 이해하지 못합니다. 그것에 대해 자세히 설명해 주시겠습니까? 참조 무결성이 있다고 가정합니다. 즉, Connections의 모든 위치 ID가 실제로 위치에 있습니다. –

+1

검색어가 올바른 것 같습니다. 위치 ID가 NULL 일 수있는 경우가 있습니까? 그렇다면'INNER JOIN' 대신'LEFT JOIN'을 사용하고 싶을 것입니다. –

+0

내 실수! 쿼리는 모든 ID의 위치 정보가 위치 테이블에 저장되는 경우 올바른 결과를 반환합니다. 나는 틀린 입장을 간과했다. –

답변

5

ID 5가 없기 때문에 ID 5에 가입 할 수 없기 때문입니다. 외부 조인을 탈퇴하면 연결을 선택하고 존재하지 않는 위치의 이름 만 갖게됩니다.

SELECT isNull(l1.LocationName,'') AS LocationFrom, isNull(l2.LocationName,'') AS LocationTo, c.Duration 
FROM Connection c 
left outer JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
left outer JOIN Location l2 ON l2.LocationID= c.LocationIDTo 
관련 문제