web-dev-qa-db-ja.com

結合ステートメントの演算順序

次の3つの方法で結合するとします

select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk

T2とt3の間の結合が失敗した場合、t1とt2の間の結合が成功した行が返されますか?操作の順序が左から右の場合はそうではないと思いますが、右から左に評価すると(t3が最初にt2に結合される)、前者が失敗した場合でもt1が返されます。

それはどのように機能しますか?

24
Alwyn

ON句の配置は、logicalの評価順序を制御します。

したがって、最初にt1 LEFT JOIN t2 ON t1.fk = t2.pkが発生します。この結合の結果は、t1, t2からのすべての一致する行を含む仮想テーブルであり、(左外部結合であるため)一致しないt1行もt2列のnull値で保持されます。

次に、この仮想テーブルは次の結合に参加します。 JOIN t3 ON t2.fk = t3.pk

t2の行と一致しないt1レコードは、最初のステージからの仮想テーブル出力の一部ではないため、最終結果には表示されません。さらに、t2.fk = t3.pkでのこの内部結合は、t2.fkNULL値をすべて失い、事実上すべてを内部結合に戻します。

論理クエリ処理はよく説明されています ここではItzik Ben Ganによって

44
Martin Smith