2014-10-28 1 views
5

이 간단한 SQL 외부 조인에 대한 잘못된 점은 무엇입니까?왼쪽 외부 조인 B가 A보다 많은 행을 반환 할 수 있습니까?

select count(*) from A -- 25766 
select count(*) from B -- 1242 
select count(*) from A left outer join B on A.b = B.b -- 310176 

return 25766, 1242 및 310176 행 (이것은 Microsoft SQL Server 2012 용입니다.) A left outer join BA에있는 것보다 더 많은 행을 반환 할 수 있습니다. 특히 this Venn 다이어그램을 제공합니까? 나는 바보 같은 실수를하고있는 것 같지만 그게 뭐야?

+2

그것을 열 것을 할 수있다하더라도 두 개의 행을 반환합니다 : 테이블 B. 예에서 많은 행과 일치하는 테이블 A의 한 행을 가질 수 있습니다 b가 전체 키가 아닌가? – Jens

+0

+1 확인하겠습니다. 어떻게 이것이 310176을 설명 할 수 있습니까? – Drux

+2

b가 키의 일부일 경우 A의 한 행을 B의 행보다 더 많이 참조 할 수 있으며 예제에서 A의 참조 12,0 ... 행의 B 행은 결과를 얻습니다. – Jens

답변

14

b 열이 테이블 B에서 고유하지 않은 경우 이러한 현상이 발생할 수 있습니다. 이 데이터가 있다고 가정 : 당신이 때

 
    A  B 
+---+ +---+---+ 
| b | | b | c | 
+---+ +---+---+ 
| 1 | | 2 | 1 | 
| 2 | | 2 | 2 | 
+---+ +---+---+ 

bBA에서 왼쪽 조인을, 당신도 모두 AB만을 가지고 있지만, 총 세 개의 행을 제공

 
+-----+------+------+ 
| A.b | B.b | B.c | 
+-----+------+------+ 
| 1 | NULL | NULL | 
| 2 | 2 | 1 | 
| 2 | 2 | 2 | 
+-----+------+------+ 

얻을 각각 두 줄.

+0

+1 예, 'select count (distinct b) from B'는 197 및 197 << 1242를 반환합니다. – Drux

3

이상한 점이 없습니다 (이 상황은 내부 조인에도 적용됩니다). 왼쪽 외부 조인 :

  • 반환 모든 행을
  • 을 조건 일치에 가입하고 조건을 조인에서 모든 행을 반환하는 크로스 B에서 최소 쿼리에 따라서

일치하지 않습니다 25766 개의 행을 반환하지만 더 많은 행이있을 수 있습니다.

A    B    Result 
+----+----+ +-----+----+ +------+-----+-----+------+ 
| id| b| | id| b| | a.id| a.b| b.b| b.id| 
+----+----+ +-----+----+ +------+-----+-----+------+ 
| 1| 10| | 123| 10| |  1| 10| 10| 123| 
+----+----+ | 456| 10| |  1| 10| 10| 456| 
      +-----+----+ +------+-----+-----+------+ 

이 테이블 A의 한 행이