web-dev-qa-db-ja.com

結合は可換性および連想性ですか?

ジョインが連想的で可換的であるところをすべて読みました。

したがって、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と結合するプロパティを持つ予想される結合テーブルが生成されるため、機能します。

6
Justin

誤った仮定をしました。

ABの間、およびBCの間に3つの関係があるが、ACの間に関係がない場合、ACを結合しても、行はありませんgive行はありません。実際にはm * n行が得られます。ここで、mAの行数で、nBの行数です。

A JOIN B on (a.id = b.A_id)
  JOIN C on (b.id = c.B_id)

最初にACを結合すると、次のようになります。

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行だけに一致する場合。 ABに結合すると、30行が返されます。これらの30行をCに結合すると、40行が返されます。

最初にACに結合し、定義する関係がない場合which行のペアはvalidになると、返されます可能なすべての行のペア =-800行。 Bを800行に結合する場合、BAの間の接続は、Bの行が特定のAC行を含むA行にのみ一致することを意味します。これらの行は40になります(C行ごとに1つ)。これらの40のうち、実際に一致するのは、BCの間の接続も有効なものだけです。また、現在のC行と一致するB行は、他のB行と一致することはできません。したがって、1つのB行で、一致する2つのAC行が、別の4つではさらに1つだけ一致する場合があります。

つまり、すべてのC行が1つ(1つだけ)のB行と一致することがわかっているため、一致の総数は再び40になります-最初にAB、またはBCを最初に一致した場合と同じ40一致。

したがって、結合の条件はどの行doが一致するかを通知しません-それは実際にどの行do n'tが一致するかを通知します。それを奪うと、あなたはCROSS JOIN-2つのテーブルの行のクロス積。

5
RDFozz

考慮

  • A、B、Cは3つのテーブルです
  • 結合操作はbyで表されます
  • セット(ベン図の下の円)は、結合列に従って形成されます。つまり、A⋈Bは、AとBの両方の結合列に同じ値を持つ行のセットを表します

結合の関連性は、次のようにベン図で視覚的に証明できます。

enter image description here

結合の可換性は、次のようにベン図で視覚的に証明できます。

enter image description here

更新
(以前の図では、∩の代わりにhadが使用されていました。以下の説明はtheのコンテキストで行われました。)

コメントで指摘してくれた@Lennartに感謝

「結合B」は「A交差B」と同じではありません

INTERSECT操作はINNER JOIN とまったく同じではないので、もっと説明が必要になると思います。リンクから次の点を強調したいと思います。

  1. INTERSECT演算子は、INNER JOIN句とほぼ同じ結果を何度も返します。
  2. INTERSECT演算子を使用する場合、列の数と順序はすべてのクエリで同じである必要があり、データ型も互換性がある必要があります。しかし、上記の3番目の箇条書きで明示的に述べたことを考慮すると、これは上記のベン図には影響しません。

    A∩Bは、AとBの両方の結合列に同じ値を持つ行のセットを表します

    つまり、∩記号は、交差ではなく結合を意味し、この点を考慮すると、結合は集合交差の動作に従います。私が犯した間違いは、symbolの代わりに記号usingを使用したことだと思います。回答を書いている間、私はINTERSECT操作を念頭に置いていませんでした。私はそれを「データベースのINTERSECT操作」としてではなく、「2つのセットの論理積」として直感的に使用しました。

  3. INNER JOINは、INTERSECTと併用すると、DISTINCTでシミュレーションできます。ただし、DISTINCTを含めずにINNER JOINのままにしても、2つの円/セットの交差には重複したレコードが含まれるため、ベン図は引き続き保持されます。

この答え は、ベン図と同様のアプローチを使用して、左外部結合の結合性を説明しようとすることにも注意してください。

まとめると、正直シンボルsymbolを⋈に変えたほうがいいと思います。

1
anir