LEFT JOINがどのように機能するかをよりよく理解する必要があります(一般に外部結合-左/右および完全[外部]結合)
LEFT JOINは常に2つのステップで実行されます:
SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions
ステップ1-LEFTJOINが最初に実行されます(ON句で指定された条件を使用して2つのテーブルを結合します)
ステップ2-WHERE条件がステップ1の結合によって生成された結果に適用されます
LEFT JOINのしくみ-簡単な注意:LEFT JOINは、右側のテーブルに一致する行がない場合でも、左側のテーブルから常にすべての行を返します。一致するものがない場合(ON条件がfalseと評価される場合)、LEFTJOINは右側のテーブルに対してNULLを返します。
RIGHT JOINは同じように機能しますが、左側のテーブルではなく、右側のテーブルからすべての行を返します。左結合として。
したがって、このクエリがある場合:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
WHERE H.STATUS='COMPLETED'
データベースは最初にLEFTJOINを実行します。つまり:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
上記のクエリでは、次の結果が得られます(右側の最後の3行にNULLがあることに注意してください):
| S.GROUP | S.TABLE_ID | H.RUN_DATE | H.STATUS |
|-----------|------------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
| Sales | 1245 | (null) | (null) |
| Reference | 1650 | (null) | (null) |
| Sales | 1784 | (null) | (null) |
次に、データベースは上記の結果セットに対してWHERE条件を実行します。
WHERE H.STATUS='COMPLETED'
NULL='COMPLETED'
以降 FALSEと評価された場合、クエリの最終結果は次のようになります。
| GROUP | TABLE_ID | RUN_DATE | STATUS |
|-----------|----------|----------------------------|-----------|
| Sales | 1210 | January, 05 2016 00:00:00 | COMPLETED |
| Sales | 1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference | 1211 | March, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | January, 05 2016 00:00:00 | COMPLETED |
| Marketing | 1230 | March, 05 2016 00:00:00 | COMPLETED |
つまり、すべてのNULLがスキップされました。
このデモを参照してください: http:// sqlfiddle .com /#!9 / e2ed0 / 3
NULL値のレコードも取得する場合は、この条件を次のように変更する必要があります。
WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )
WHERE句からこの条件を削除して、LEFTJOINのON条件に追加することもできます。つまり:
SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS
FROM source_table S
LEFT JOIN HISTORY H
ON ( S.TABLE_ID=H.TABLE_ID AND H.STATUS='COMPLETED' )
このデモの最後のクエリを参照してください: http://sqlfiddle.com/#!9/e2ed0 / 3