複数テーブル - sql join 条件



左のOracle構文左は3つ以上のテーブルを結合する (2)

私は古いoracle Left Join構文を頭の中に入れようとしています。 2つのテーブルでうまくいく:

FROM A, B
WHERE
A.Col = B.Col (+)

(このクエリをQ0と呼ぶことができます)

これは、このベン図で例えば理解するのは簡単です

しかし、私たちの脳がシャットダウンしたいときに、3つ目のテーブル以上をミックスに追加すると、

FROM A,B,C
WHERE 
A.C = B.C (+) AND
C.C = A.C (+)

(これをQ1と呼ぶ)

どちらにする必要があります:(私はちょうど左の結合条件の場所を変更しました)

FROM A,B,C
WHERE 
C.C = A.C (+) AND
A.C = B.C (+)

(これをQ2と呼ぶことができます)

だからここでこれらの質問に私の取る、私の質問はここで私は正しく理解している場合です:

私の理解では、2つ以上のテーブルの左の結合を解釈する方法は、左の結合のチェーンとして見て、もう一方の入力が正しいのですか?

したがって、Q1では2つの左結合があります。最初の結合はAと左結合で、Aは左の表です。 2番目の左の結合は、それが私のためにやりにくくなるところです。 最初はテーブルCがテーブルAと結合したと思っていましたが、ここでCは左側のテーブルでした。 しかし、これは間違っているように見えます。むしろ、Cが左の表である最初の左結合の結果と結合したままになっているように見えるはずです。 これは正しいです?

しかし、Q2ではこの「連鎖原理」をどのように適用するのですか?

私はQ1から推論をコピーしようとしました:最初の結合は、Cが左のテーブルであるAと結合した左です。 2番目の結合は、Aと最初の結合の結果の間の左結合です(Aは左の表です)。 しかしこれは意味をなさない.2番目の左結合の結合条件はA列とB列の間にあり、最初の左結合の結果にB列はない。

好奇心から+ 2番目の参加の左と右のテーブルを切り替えることを試みた、それは最初の参加の代わりに、2番目の左の参加の左のテーブルとして動作し、Bと結合したままになります。そして、これは、 Q1と同じになる。 しかし、私はそれがなぜ機能するのか説明する方法は知らない。

ですから、誰かがoracle構文を使用するときに3つ以上のテーブルに対して一般的に適用する推論方法を提案できれば、それは大いに評価されるでしょう。 このような一般的な方法が、Oracle構文をANSI構文に変換する一般的な方法で構成されていれば、私はそれをはるかに簡単に理解できます。

https://src-bin.com


Answer #1

(+)スタイルの外部結合は、Oracleが9i以来サポートしている標準のANSI OUTER JOINS(および可読性IMHO)と比較して、機能面で劣ります。

あなたが望むのは効果的です

FROM C
LEFT JOIN A ON C.C = A.C
LEFT JOIN B ON A.C = B.C

今それは意味があるのですか? 正直言って、私はあなたの質問を理解していません。上記の構文がどのように働いているかは、私には本当に明らかです。


Answer #2

あなたはカスケーディングな方法でそれを見ることができます。 ただし、キーは、同じクエリ内で左右に結合されているテーブルを探すことです。 この場合、順序は異なります。表が正しく結合された状態が最初に適用されます。 私は次の図がこれについていくつかの光を当てることを願っています:

クエリの実行計画を見て、これらの結合の順序を確認することもできます。

Q1の場合:

select a.c a, b.c b, c.c c   from a, b, c  where a.c = b.c (+)    and
c.c = a.c (+)

------------------------------------------------------------------------
| Id  | Operation           | Name | E-Rows |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |        |       |       |          |
|*  1 |  HASH JOIN OUTER    |      |      4 |  2168K|  2168K|  805K (0)|
|*  2 |   HASH JOIN OUTER   |      |      4 |  2616K|  2616K|  981K (0)|
|   3 |    TABLE ACCESS FULL| C    |      4 |       |       |          |
|   4 |    TABLE ACCESS FULL| A    |      4 |       |       |          |
|   5 |   TABLE ACCESS FULL | B    |      4 |       |       |          |
------------------------------------------------------------------------

Q2の場合:

select a.c a, b.c b, c.c c   from a, b, c  where c.c = a.c (+)    and
a.c = b.c (+)

------------------------------------------------------------------------
| Id  | Operation           | Name | E-Rows |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |        |       |       |          |
|*  1 |  HASH JOIN OUTER    |      |      4 |  2168K|  2168K|  801K (0)|
|*  2 |   HASH JOIN OUTER   |      |      4 |  2616K|  2616K|  983K (0)|
|   3 |    TABLE ACCESS FULL| C    |      4 |       |       |          |
|   4 |    TABLE ACCESS FULL| A    |      4 |       |       |          |
|   5 |   TABLE ACCESS FULL | B    |      4 |       |       |          |
------------------------------------------------------------------------




left-join