2010-04-23 5 views
5

Мне часто задают вопросы в интервью, что «что такое внешнее соединение в SQL»?Каковы хорошие примеры использования SQL OUTER JOIN?

В то время как на это можно ответить, интересно, какие могут быть некоторые классические и хорошие примеры реальной жизни, в которых используется (ВЛЕВО) ВНЕШНИЙ JOIN?

+0

Возможный дубликат http://stackoverflow.com/questions/1101343/what-is-the-purpose-or-use-case-for-an-outer-join-in-sql –

ответ

6

В базе данных Northwind на столе клиентов и заказов.

Выполнение внутреннего соединения даст вам только тех клиентов, которые разместили заказы.

Выполнение внешнего соединения получит все клиентов и заказов для клиентов, разместивших заказы.

3

A LEFT OUTER JOIN может использоваться, когда вы хотите, чтобы все записи из одной таблицы, а также записи из другой таблицы, если таковые имеются.

Например, данная таблица User и Address, где Address имеет FK к User и не может быть 0 или больше адресов для каждого пользователя:

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

Это позволит вам получить все User записи, независимо от того, есть ли была соответствующая запись Address или нет.

Если вы хотите, чтобы показать все пользователи, которые не имеют адреса, вы можете сделать это:

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

Классический пример - cutomers и заказы. У некоторых клиентов есть заказы, а у других нет. Вы хотите показать список клиентов с общим объемом продаж. Таким образом, вы выполняете левое внешнее соединение от клиента до заказа и получаете:

Клиент A: 100 долларов США; Клиент B: $ 0; Клиент C: $ 500

вместо:

Клиент А: $ 100; Клиент C: $ 500

1

Получите список всех клиентов, включая любые детали заказов, которые они сделали. Некоторые клиенты, возможно, не сделали заказы, и поэтому INNER JOIN исключит их из этого списка.

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

Вот пример:

Мне нужен список всех клиентов, с их ваучерами, мне нужно клиенты, которые никогда не использовали ваучера.

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

Чтобы добавить ответ Robin Day, вы можете также использовать левое внешнее соединение, чтобы захватить только клиенты, которые не размещали заказы, проверяя NULL.


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

Ниже зрительная represntation левого внешнего соединения

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

alt text

подробнее о присоединяется в следующей статье http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx (один из лучших статей должны читать)