以下のためにINNER
参加し、いいえ、順序は重要ではありません。選択をからSELECT *
に変更する限り、クエリは同じ結果を返しますSELECT a.*, b.*, c.*
。
(LEFT
、RIGHT
またはFULL
)OUTER
結合の場合、はい、順序が重要です-(更新された)ものははるかに複雑です。
まず、外部結合は可換でa LEFT JOIN b
はないので、b LEFT JOIN a
外部結合も関連性がないため、(可換性と結合性)の両方のプロパティを含む例では、次のようになります。
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
と同等です:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
だが:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
と同等ではありません:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
別の(うまくいけばより単純な)連想の例。これを次のように考えてください(a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
これは同等であるとa LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
「良い」ON
条件があるからです。ON b.ab_id = a.ab_id
とc.bc_id = b.bc_id
は両方とも同等性チェックであり、NULL
比較は行いません。
他の演算子ON a.x <= b.x
やON a.x = 7
、ON a.x LIKE b.x
or ON (a.x, a.y) = (b.x, b.y)
、or 、or などのより複雑な演算子を使用して条件を設定することもできますが、2つのクエリは同等です。
ただし、これらのいずれか、またはなどのIS NULL
nullに関連する関数、COALESCE()
たとえば条件がの場合b.ab_id IS NULL
、2つのクエリは同等ではありません。
<blahblah>
?AからBとAからCに参加していますか、それともAからBとBからCに参加していますか?