ジョインが連想的で可換的であるところをすべて読みました。
したがって、A join (B join C)
は(A join C) join B
と同じである必要があります。
しかし、私はこれがどのようになり得るかを理解するのに本当に苦労しています。 AにはBと共通のプロパティがあり、BにはCと共通のプロパティがあるが、AとCは結合する共通のプロパティを共有していないとします。
その場合、2番目のインスタンス(A join C) join B
では、AとCを結合する操作が行われたときに空のセットが生成され、Bとの結合が不可能になるようです。
一方、最初のケースでは、BがCを結合すると、Aと結合するプロパティを持つ予想される結合テーブルが生成されるため、機能します。
誤った仮定をしました。
A
とB
の間、およびB
とC
の間に3つの関係があるが、A
とC
の間に関係がない場合、A
とC
を結合しても、行はありませんgive行はありません。実際にはm * n行が得られます。ここで、mはA
の行数で、nはB
の行数です。
A JOIN B on (a.id = b.A_id)
JOIN C on (b.id = c.B_id)
最初にA
とC
を結合すると、次のようになります。
A JOIN C on (1 = 1)
JOIN B on (a.id = b.A_id AND b.id = c.B_id)
注:大学は30年以上前のことです-うまくいけば、概念を理解し、実際のリレーショナル代数の正しい構文に書き直すことができます。
A
に20行、B
に30行、C
に40行があり、B
のすべての行がA
の1行だけに一致し、C
のすべての行がB
の1行だけに一致する場合。 A
をB
に結合すると、30行が返されます。これらの30行をC
に結合すると、40行が返されます。
最初にA
をC
に結合し、定義する関係がない場合which行のペアはvalidになると、返されます可能なすべての行のペア =-800行。 B
を800行に結合する場合、B
とA
の間の接続は、B
の行が特定のAC
行を含むA
行にのみ一致することを意味します。これらの行は40になります(C
行ごとに1つ)。これらの40のうち、実際に一致するのは、B
とC
の間の接続も有効なものだけです。また、現在のC
行と一致するB
行は、他のB
行と一致することはできません。したがって、1つのB
行で、一致する2つのAC
行が、別の4つではさらに1つだけ一致する場合があります。
つまり、すべてのC
行が1つ(1つだけ)のB
行と一致することがわかっているため、一致の総数は再び40になります-最初にA
とB
、またはB
とC
を最初に一致した場合と同じ40一致。
したがって、結合の条件はどの行doが一致するかを通知しません-それは実際にどの行do n'tが一致するかを通知します。それを奪うと、あなたはCROSS JOIN
-2つのテーブルの行のクロス積。
考慮
結合の関連性は、次のようにベン図で視覚的に証明できます。
結合の可換性は、次のようにベン図で視覚的に証明できます。
更新
(以前の図では、∩の代わりにhadが使用されていました。以下の説明はtheのコンテキストで行われました。)
コメントで指摘してくれた@Lennartに感謝
「結合B」は「A交差B」と同じではありません
INTERSECT
操作はINNER JOIN
とまったく同じではないので、もっと説明が必要になると思います。リンクから次の点を強調したいと思います。
INTERSECT
演算子は、INNER JOIN
句とほぼ同じ結果を何度も返します。INTERSECT
演算子を使用する場合、列の数と順序はすべてのクエリで同じである必要があり、データ型も互換性がある必要があります。しかし、上記の3番目の箇条書きで明示的に述べたことを考慮すると、これは上記のベン図には影響しません。
A∩Bは、AとBの両方の結合列に同じ値を持つ行のセットを表します
つまり、∩記号は、交差ではなく結合を意味し、この点を考慮すると、結合は集合交差の動作に従います。私が犯した間違いは、symbolの代わりに記号usingを使用したことだと思います。回答を書いている間、私はINTERSECT
操作を念頭に置いていませんでした。私はそれを「データベースのINTERSECT
操作」としてではなく、「2つのセットの論理積」として直感的に使用しました。
INNER JOIN
は、INTERSECT
と併用すると、DISTINCT
でシミュレーションできます。ただし、DISTINCT
を含めずにINNER JOIN
のままにしても、2つの円/セットの交差には重複したレコードが含まれるため、ベン図は引き続き保持されます。
この答え は、ベン図と同様のアプローチを使用して、左外部結合の結合性を説明しようとすることにも注意してください。
まとめると、正直シンボルsymbolを⋈に変えたほうがいいと思います。