2010-12-06 2 views
1

SQL Server 2005 데이터베이스의 조인 문제가 있습니다. 그래서SQL Server : 왼쪽 외부 조인 + 종속 내부 조인을 사용하여 쿼리를 만드는 방법?

TableA --LEFT JOIN--> TableB --INNER JOIN-->TableC 

나는이 같은 쿼리를 작성하는 경우 : 나는 다음과 같은 테이블 구조를했습니다 TableA 레코드와 관련된 어떤 TableB 기록이 아니라면

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN TableB ON TableA.keyOfB = TableB.key 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
where TableA.key = aValue 

이 0 레코드를 읽을. 그러나 TableB은 외부 조인이므로 예상 한 바가 아닙니다. 즉, TableB 레코드가 없기 때문에 내부 조인은 considerer가되어서는 안됩니다. 내가 누락 된 부분이 있습니까?

답변

1

나는 그것이 JOIN 연산의 순서과 관련이있다 생각합니다.

결과 (왼쪽 외부 조인 B) 내부 조인 C, 왼쪽 외부 (B 내부 조인 C)를 원한다.

거기에 몇 개를 놓으십시오.

또는 당신이 ... B INNER C RIGHT OUTER A는 (B INNER C) RIGHT OUTER A.

편집 얻기 위해 조인을 재정렬 시도 : 내가 무슨 생각의 예 :

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN (TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) 
ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 
을 RIGHT OUTER에

뒤집기 :

SELECT TableA.* FROM TableB 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
RIGHT OUTER JOIN TableA ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

참고 :이 작동하지 않는 경우 나는 버전 이후 SQLSERVER 감동하지 않은, 용서 7

1

(B + C) 조인을 위해 가상 테이블을 사용하십시오.
편집 : 같은 뭔가 : 예상대로

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN 
    (select key from TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) as TableBC 
    ON TableA.keyOfB = TableBC.key 
where TableA.key = aValue 
+0

Pierluigi 's code를 당신의 제안으로 수정할 수 있습니까? 그 의미가 확실하지 않습니다. – David

+0

+1 - 나는 OP가 처음에는 필요로하는 것을 실제로 얻지 못했지만이 부분이 중요하다고 생각합니다. 일단 당신이 제안한대로 그룹화하면 A 레코드 만 '필수적'이며 B와 C의 필드는 모두 일치하면 따라옵니다. –

+0

약간의 괄호를 추가하는 것만 큼 쉽지는 않지만, 뭔가 재치있는 명령이나 아마도 새로운 SELECT를 필요로합니다. 뭔가 영리한 실종 (항상 매우 가능합니다 = P)이없는 한, –

1

이 정확히 작동하고. TableB와의 링크는 TableB를 통해 이루어 지므로 TableB 레코드가 없으면 링크가 연결되지 않습니다.

INNER JOIN에서 LEFT OUTER까지 변경 - 실제로는 관련 데이터까지는 내부입니다.

1

INNER JOIN없이 쿼리를 실행하면 TableB.key가 null 인 모든 레코드가 생깁니다. 맞습니까? 다음 INNER JOIN은 일치하는 레코드를 찾을 수 없기 때문에 결과가 없습니다.

0

다음은 테이블 b와 c 모두에 대해 왼쪽으로 조인을 사용하는 예입니다.

declare @TableA table (Adata1 char(2), Adata2 char(2)) 
declare @TableB table (Bdata1 char(2), Bdata2 char(2)) 
declare @TableC table (Cdata1 char(2), Cdata2 char(2)) 

;Insert @TableA 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableB 
Select 'Ab', 'Ab' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableC 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'Cb', 'Cb' 

--Select * From @TableA 
--Select * From @TableB 
--Select * From @TableC 

Select * from @TableA 
LEFT OUTER JOIN @TableB on Adata1 = Bdata1 
LEFT OUTER JOIN @TableC on Bdata1 = Cdata1 

결과는 다음과 같습니다

Adata1 Adata2 Bdata1 Bdata2 Cdata1 Cdata2 
A   A NULL NULL NULL NULL 
B   B B B B B 
C   C C Cb NULL NULL 
관련 문제