SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C
上記のスニペットから、TABLE C は (TABLE B) または (TABLE A LEFT JOIN TABLE B のデータ) または (TABLE A) に左結合しますか?
TABLE C は 1. (TABLE B) または 2. (TABLE A LEFT JOIN TABLE B からのデータ) または 3. (TABLE A) に左結合しますか?
二番目。しかし、結合条件は、より理解を深めるのに役立ちます。
あなたは書ける:
SELECT *
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.ID = C.ID)
ただし、次のことができます。
SELECT *
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)
したがって、前のテーブルのすべてのフィールドで結合でき、前の結合の「結果」で結合できます (ただし、エンジンは結果を取得する方法を選択する場合があります)。
左結合を非可換演算と考えてください (A left join B
は と同じではありませんB left join A
)。そのため、順序が重要であり、C は前の結合テーブルで結合されたままになります。
Oracleのドキュメントは、結合がどのように処理されるかについて非常に具体的です。
3 つ以上のテーブルの結合を実行する場合、Oracle はまず、列を比較する結合条件に基づいて 2 つのテーブルを結合し、次に、結合されたテーブルの列と新しいテーブルを含む結合条件に基づいて、結果を別のテーブルに結合します。すべてのテーブルが結果に結合されるまで、Oracle はこのプロセスを続行します。
これは、結合を処理するためのロジック アプローチであり、ANSI 標準と一致しています (つまり、すべてのデータベース エンジンが結合を順番に処理します)。
ただし、クエリが実際に実行されると、オプティマイザーは結合を別の順序で実行することを選択する場合があります。結果は、クエリで指定された順序で結合を処理した場合と論理的に同じである必要があります。
また、結合条件により、予期しない条件が発生する場合があります。あなたが持っている場合:
from A left outer join
B
on A.id = B.id left outer join
C
on B.id = C.id
A
次に、とC
それぞれに特定の ID を持つ行があるが、そうでないという条件があるかもしれB
ません。この定式化では、C
に結合しているため、 の行は表示されませんNULL
。left outer join
そのため、特にチェーンの最初のテーブル以外のテーブルに結合する場合は、 の結合条件に注意してください。