インタビューで「SQLの外部結合とは」という質問をよく受けます。
答えることはできますが、(左)外部結合が使用されている古典的で優れた実際の例は何でしょうか?
インタビューで「SQLの外部結合とは」という質問をよく受けます。
答えることはできますが、(左)外部結合が使用されている古典的で優れた実際の例は何でしょうか?
顧客および注文テーブルのNorthwindデータベース。
内部結合を行うと、注文した顧客のみが提供されます。
外部結合を行うと、すべての顧客と、注文した顧客の注文が取得されます。
Robin Dayの回答に追加するために、Left Outer Joinを使用して、NULLをチェックすることにより、注文を行っていない顧客のみを取得することもできます。
SELECT *
FROM Customer
LEFT OUTER JOIN Order
ON Customer.CustomerId = Order.CustomerId
WHERE Order.CustomerId IS NULL
以下は、左外側の結合の視覚的表現です
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
結合の詳細については、以下の記事 http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspxを参照してください(最高の記事の1つを読む必要があります)
ALEFT 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
古典的な例は、cutomersとordersです。注文がある顧客とない顧客がいます。総売上高のある顧客のリストを表示したいとします。したがって、顧客から注文への左外部結合を実行して、次のようにします。
顧客A:$ 100; 顧客B:$ 0; 顧客C:500ドル
それ以外の:
顧客A:$ 100; 顧客C:500ドル
次に例を示します。
バウチャーを含むすべての顧客のリストが必要です。また、バウチャーを使用したことがない顧客も必要です。
SELECT *
FROM Customer
LEFT OUTER JOIN Voucher
ON Customer.CustomerId = Voucher.CustomerId
注文の詳細を含むすべての顧客のリストを取得します。一部の顧客は注文をしていない可能性があるため、INNERJOINはそれらをこのリストから除外します。
SELECT
*
FROM
Customer
LEFT OUTER JOIN
Order
ON
Customer.CustomerId = Order.CustomerId