外部結合は内部結合の結果に対し、結合する2つのテーブルのうち、一方のテーブルに含まれるデータをすべて取得します。
外部結合の構文は次のような形です。
SELECT 列名 FROM テーブル1
[LEFT or RIGHT] OUTER JOIN テーブル2 ON 結合条件
「OUTER JOIN」は外部結合であることを示し、LEFTもしくはRIGHT句にて、結合するどちらのテーブルのデータを全件表示対象とするか指定します。LEFTを使う場合は左外部結合、RIGHTの場合は右外部結合と呼びます。
外部結合は実際の動きを確認すると理解しやすいので、早速サンプルを取り上げます。
SELECT PD.ProductID, PD.Name AS 商品名, PD.ProductSubcategoryID, PS.Name AS サブカテゴリ名 FROM Production.Product AS PD LEFT OUTER JOIN Production.ProductSubcategory AS PS ON PD.ProductSubcategoryID = PS.ProductSubcategoryID 結果 ProductID 商品名 ProductSubcategoryID サブカテゴリ ---------- ------------------- --------------------- ------------ 1 Adjustable Raceaaa NULL NULL 2 Bearing Ball NULL NULL …中略… 998 Road-750 Black, 48 2 Road Bikes 999 Road-750 Black, 52 2 Road Bikes
このサンプルでは、左外部結合を利用し、結合条件に一致するデータに加えて、商品マスタのデータをすべて表示しています。内部結合では表示されなかった商品データが表示されている点に注目してください。サンプルで示した結果では1〜2行目が該当し商品マスタの内容がそのまま出力されています。ただし、「ProductSubcategoryID」はNULLであるためサブカテゴリマスタとの結合は行えず、サブカテゴリマスタより取得するサブカテゴリ名がNULLとなります。
サンプルのLEFTをRIGHTに置き換え右外部結合とすると、結合条件に一致するデータにサブカテゴリマスタの全件データが加わり表示されます。ただし、サブカテゴリマスタに存在するすべてのコードは商品マスタで指定されているため、右外部結合と内部結合の結果で取得件数に変化はありません。
今回はSELECT文での難関となる結合を取り上げました。内部結合、外部結合でそれぞれどのように結果が異なるか、しっかりと把握しておく必要があります。外部結合では、指定したテーブルの全件を取得できるため、結合条件に左右されることなくデータを得ることができます。一方、内部結合の場合は結合条件に一致するデータのみ取得するため、そのほかにどのようなデータが存在するか知ることができません。また一方で、外部結合では指定したテーブルの全データを取得するため、必要以上のデータを取得してしまう可能性もあります。このように、結合を利用する際にはそれぞれの動作特性を把握し、テーブルの論理的な関連性に合わせて適切に利用する必要があります。
また、結合の方法には取り上げた内部結合、右・左外部結合以外にも、クロス結合や自己結合といった結合の方法が存在します。これらの利用頻度は低いため連載では取り上げませんでしたが、それぞれ利用価値があるためその利用法を確認しておきましょう。
次回は複数のSQL文を組み合わせて結果を取得できる「サブクエリ」を取り上げます。お楽しみに!(次回へ続く)
石橋潤一
株式会社システムインテグレータ勤務。Web+DBの業務アプリをメインに開発に携わる。@IT連載記事「SQL Server 2005を使いこなそう」「SQL Server 2005 CTPレビュー」執筆のほか、著書に『DBマガジン別冊 SQL Server 2005徹底活用ガイド』(翔泳社刊/共著)、『ASP.NET+SQL Server ゼロからはじめるWebアプリケーション』(ソフトバンクパブリッシング刊/共著)。
Copyright © ITmedia, Inc. All Rights Reserved.