前回の続き
前回は内部結合の話でした。
結合には外部結合というのがあって、今回はこれを学びます。
外部結合
まず、内部結合のおさらいですが、内部結合はテーブル同士のキーをもとに、一致するレコードだけを抽出しました。
つまり、共通部分ということになります。
図にするとこんな感じです。
一方で、外部結合は、左外部結合と右外部結合と完全外部結合があります。
左外部結合
→Aすべての要素に対して、AとBの共通部分のカラムをくっつけてあげる。
右外部結合
→左外部結合の逆
完全外部結合
→AとBすべてのレコードを抽出。ただし、共通するキーに対してはカラム同士を結合する。
左外部結合
左外部結合と右外部結合は、書き順を入れ替えるだけなので左外部結合のみあつかいます。
Person.PersonとSales.PersonCreditCardを.BusinessEntityIDで結合します。
SELECT * FROM Person.Person PP LEFT JOIN Sales.PersonCreditCard PC ON PP.BusinessEntityID = PC.BusinessEntityID
結果は以下の通り。
みてのとおり、Aのキーに対してBのキーが見つからないカラムは結合できないので、NULLで埋められる。
これを利用して、AにあってBにないレコードを抽出してみます。
つまりここの部分です。
SQLを書いてみます。 WHERE句を加えるだけです。
SELECT * FROM Person.Person PP LEFT JOIN Sales.PersonCreditCard PC ON PP.BusinessEntityID = PC.BusinessEntityID WHERE PC.BusinessEntityID IS NULL
結果はこんな感じ。
854件だとわかりました。
完全外部結合
完全外部結合は、AとBのすべてのレコードを含めてくれますが、キーが一致するレコードはまとめて1レコードにしてカラムにデータをまとめてくれます。
以下のように書いてみましょう。
結合キーは全く関係ないものですが、FULL JOINだとすべてのレコードを抽出してくれますので、それぞれのテーブルのレコードの和の分だけ出力されます。
SELECT * FROM Person.Person PP FULL JOIN Sales.PersonCreditCard PC ON PP.BusinessEntityID = PC.CreditCardID
結果は以下の通り。
20777件出力できました。
以上、今回はここまで。
次回もまだまだSELECTです。