LEFT (OUTER) JOIN (左外部結合)を使ってデータを取得する

LEFT (OUTER) JOIN (左外部結合)を使ってデータを取得する

前回は 「 INNER JOIN (内部結合)を使ってデータを取得する 」 で、INNER JOIN を使って、二つのテーブルを結合してデータを取得しました。

OUTER JOIN (外部結合) には LEFT, RIGHT, FULL の 3 種類があります。


今回は LEFT (OUTER) JOIN (左外部結合) を使って、二つのテーブルを結合して値を取得してみましょう。 OUTER は省略できるので、省略します。

まだ生成していなければ、こちら のスクリプトを実行して、Student・Test・TestResult テーブルを生成しておいてください。

LEFT JOIN (左外部結合)

LEFT JOIN を使って、 [左テーブル] LEFT JOIN [右テーブル] ON ... のように結合すると、左側の [左テーブル] の全レコードと、ON で指定した条件がマッチする [右テーブル] のレコードが取得されます。

JOIN (結合)の基本と種類について 2


例えば、次のような TestResult テーブルと Student テーブルがあります。

[ TestResult テーブル ]
OUTER JOIN (外部結合)を使ってデータを取得する 1

[ Student テーブル ]
OUTER JOIN (外部結合)を使ってデータを取得する 2


StudentID がマッチするという条件で LEFT JOIN することによって、TestResult テーブルの TestID = 2 の全レコードと、StudentID がマッチする Student の名前が取得できます。

SELECT  TR.*,
        S.FirstName,
        S.LastName
FROM    TestResult AS TR
            LEFT JOIN Student AS S
                ON TR.StudentID = S.StudentID
WHERE   TestID = 2;

[ 実行結果 ]
OUTER JOIN (外部結合)を使ってデータを取得する 3


下のように、TestResult テーブルの TestID = 2 の全レコードと、 StudentID がマッチする StudentID が 1, 3, 4 の名前のみが Student テーブルから取得されましたね。

OUTER JOIN (外部結合)を使ってデータを取得する 4

LEFT JOIN を使う時の注意点

LEFT JOIN を使う時に、WHERE 句で右テーブルのカラムを使って条件を指定してしまうと、左テーブルのマッチしない行は結果セットに含まれません。

SELECT  TR.*,
        S.FirstName,
        S.LastName,
        S.Birthday
FROM    TestResult AS TR
            LEFT JOIN Student AS S
                ON TR.StudentID = S.StudentID
WHERE   S.Birthday < '2000-01-01';

[ 実行結果 ]
OUTER JOIN (外部結合)を使ってデータを取得する 5


わかっていて使うのであれば問題ありませんが、もし左テーブルのマッチしない行は含めて、右テーブルの選択されるレコードに条件を追加したい時は、ON に追加すると期待の結果が得られます。

SELECT  TR.*,
        S.FirstName,
        S.LastName,
        S.Birthday
FROM    TestResult AS TR
            LEFT JOIN Student AS S
                ON TR.StudentID = S.StudentID
                    AND S.Birthday < '2000-01-01';

[ 実行結果 ]
OUTER JOIN (外部結合)を使ってデータを取得する 6


次は、RIGHT (OUTER) JOIN (右外部結合)を使ってデータを取得してみましょう。

© 2010-2024 SQL Server 入門