2010-04-23 33 views
5

Tôi thường được hỏi các câu hỏi trong một cuộc phỏng vấn rằng "một kết nối bên ngoài trong SQL" là gì?Một số ví dụ điển hình khi sử dụng OUTER JOIN của SQL là gì?

Trong khi nó có thể được trả lời, tôi tự hỏi những gì có thể là một số ví dụ thực tế đời sống kinh điển và tốt, nơi một (LEFT) OUTER JOIN được sử dụng?

+0

có thể trùng lặp của http://stackoverflow.com/questions/1101343/what-is-the-purpose-or-use-case-for-an-outer-join-in-sql –

Trả lời

6

Trong cơ sở dữ liệu Northwind trên khách hàng và đơn đặt hàng bảng.

Thực hiện tham gia bên trong sẽ chỉ cung cấp cho bạn những khách hàng đã đặt hàng.

Thực hiện kết nối bên ngoài sẽ nhận được tất cả khách hàng và đơn đặt hàng cho khách hàng đã đặt hàng.

3

Có thể sử dụng LEFT OUTER JOIN khi bạn muốn tất cả các bản ghi từ một bảng, cũng như các bản ghi từ một bảng khác nếu có.

Ví dụ, bảng cho UserAddress, nơi Address có FK để User và có thể là 0 hoặc nhiều địa chỉ cho mỗi người dùng:

select * 
from User u 
left outer join Address a on u.UserID = a.UserID 

này sẽ đảm bảo bạn sẽ có được tất cả User hồ sơ, bất kể có là một bản ghi tương ứng Address hay không.

Nếu bạn muốn hiển thị tất cả người sử dụng mà không có địa chỉ, bạn có thể làm điều này:

select * 
from User u 
left outer join Address a on u.UserID = a.UserID 
where a.UserID is null 
3

Ví dụ cổ điển là cutomers và đơn đặt hàng. Một số khách hàng có đơn đặt hàng và những người khác thì không. Bạn muốn hiển thị danh sách khách hàng với tổng doanh thu. Vì vậy, bạn thực hiện việc tham gia bên ngoài bên trái từ khách hàng với đơn đặt hàng và nhận được:

Khách hàng A: $ 100; Khách hàng B: $ 0; khách hàng C: $ 500

thay vì:

khách hàng A: $ 100; Khách hàng C: $ 500

1

Nhận danh sách tất cả khách hàng bao gồm mọi chi tiết về đơn đặt hàng mà họ đã thực hiện. Một số khách hàng có thể không có đơn đặt hàng và do đó, INNER JOIN sẽ loại trừ chúng khỏi danh sách này.

SELECT 
    * 
FROM 
    Customer 
LEFT OUTER JOIN 
    Order 
ON 
    Customer.CustomerId = Order.CustomerId 
2

Dưới đây là một ví dụ:

Tôi cần một danh sách tất cả khách hàng, với chứng từ của họ, tôi cũng cần những khách hàng mà không bao giờ sử dụng chứng từ.

SELECT * 
FROM Customer 
LEFT OUTER JOIN Voucher 
ON Customer.CustomerId = Voucher.CustomerId 
6

Để thêm vào câu trả lời của Robin Day, bạn cũng có thể sử dụng Left External Join để chỉ lấy những khách hàng KHÔNG đặt hàng bằng cách kiểm tra NULL.


SELECT * 
FROM Customer 
    LEFT OUTER JOIN Order 
    ON Customer.CustomerId = Order.CustomerId 
WHERE Order.CustomerId IS NULL 
5

Dưới đây là represntation trực quan của bên ngoài trái tham gia

SELECT <select_list> 
FROM Table_A A 
LEFT JOIN Table_B B 
ON A.Key = B.Key 

alt text

đọc thêm về tham gia trong bài viết dưới đây http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx (một trong những bài viết hay nhất phải đọc)

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