sql >> データベース >  >> RDS >> Oracle

Oracle-複数のテーブルの左外部結合が目的のnull値を返さない

    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




    1. MySQLとPHPを使用したベストマッチ

    2. MY SQL-エラーコード:1010。データベースの削除中にエラーが発生しました(rmdirできません; errno:13)

    3. シェルスクリプトからsqlplusを呼び出すときのpasswdの抑制

    4. pyodbcとmySQL