2014-10-28 17 views
5

Điều gì sai về việc tham gia ngoài SQL đơn giản này?Làm thế nào một phép nối ngoài bên trái B trả về nhiều hàng hơn trong 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 

trả lại 25766, 1242 và 310176 hàng tương ứng. (Điều này là dành cho Microsoft SQL Server 2012.) Làm thế nào có thể A left outer join B bao giờ trở lại nhiều hàng hơn tồn tại trong A, đặc biệt là cho this biểu đồ Venn? Tôi đoán tôi đang mắc sai lầm ngu ngốc nhưng nó là gì?

+2

Nó có thể được rằng cột b không phải là toàn bộ chìa khóa? – Jens

+0

+1 Tôi sẽ kiểm tra. Làm thế nào điều này có thể giải thích 310176? – Drux

+2

Nếu b chỉ là một phần của khóa, có thể là một dòng trong A tham chiếu nhiều dòng hơn trong B và nếu trong bản ghi ví dụ 1 của bạn về A tham chiếu 12,0 ... hàng trong B, bạn sẽ nhận được kết quả của mình. – Jens

Trả lời

14

Điều này có thể xảy ra khi cột b không phải là duy nhất trong bảng B. Giả sử bạn có dữ liệu này:

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

Khi bạn trái tham gia A-B trên cột b, bạn sẽ có được

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

mang đến cho ba hàng trong tổng số, mặc dù cả hai AB chỉ có hai hàng mỗi.

+0

+1 Có, 'số đếm (khác biệt b) từ B' trả về 197, và 197 << 1242. – Drux

3

Không có gì lạ về nó (và tình huống này cũng áp dụng cho các kết nối bên trong). Một trái bên ngoài tham gia:

  • Returns tất cả các hàng từ A chéo B nơi tham gia trận đấu tình trạng
  • Và trả về tất cả các hàng từ A nơi điều kiện tham gia không phù hợp

Vì vậy, ở mức tối thiểu các truy vấn sẽ trả lại 25766 hàng nhưng có thể có nhiều hơn. Có thể có một hàng trong bảng A phù hợp với nhiều dòng trong bảng B. Ví dụ:

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| 
      +-----+----+ +------+-----+-----+------+ 

này trả về hai hàng mặc dù có một dòng trong bảng A.

Các vấn đề liên quan