Каковы хорошие примеры использования OUTER JOIN в SQL? - PullRequest
6 голосов
/ 23 апреля 2010

Мне часто задают вопросы в интервью, что "что такое внешнее объединение в SQL"?

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

Ответы [ 7 ]

6 голосов
/ 23 апреля 2010

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


SELECT *
FROM  Customer
  LEFT OUTER JOIN Order 
    ON Customer.CustomerId = Order.CustomerId
WHERE Order.CustomerId IS NULL
6 голосов
/ 23 апреля 2010

В базе данных Northwind в таблице «Клиенты и заказы».

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

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

5 голосов
/ 23 апреля 2010

Ниже приведена визуальная репрезентация левого внешнего соединения.

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статью обязательно читать)

4 голосов
/ 23 апреля 2010

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 голосов
/ 23 апреля 2010

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

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

вместо:

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

2 голосов
/ 23 апреля 2010

Вот пример:

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

SELECT *
FROM Customer
LEFT OUTER JOIN Voucher
 ON Customer.CustomerId = Voucher.CustomerId
1 голос
/ 23 апреля 2010

Получить список всех клиентов, включая любые детали заказов, которые они сделали. Некоторые клиенты, возможно, не сделали заказы, и поэтому ВНУТРЕННЕЕ СОЕДИНЕНИЕ исключило бы их из этого списка.

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