1. ホーム
  2. sql

[解決済み] Oracle 11gで+記号を使用した左外部結合

2023-07-07 19:07:06

質問

以下の2つのクエリが左外部結合または右外部結合の例であるかどうか、どなたか教えていただけませんか?

Table Part:
Name         Null?       Type
PART_ID      NOT NULL    VARCHAR2(4)
SUPPLIER_ID              VARCHAR2(4)

PART_ID SUPPLIER_ID
P1      S1
P2      S2
P3  
P4  

Table Supplier:
Name            Null?     Type
SUPPLIER_ID NOT NULL      VARCHAR2(4)
SUPPLIER_NAME   NOT NULL  VARCHAR2(20)

SUPPLIER_ID  SUPPLIER_NAME
S1           Supplier#1
S2           Supplier#2
S3           Supplier#3

サプライヤーの有無にかかわらず、すべての部品を表示する。

SELECT P.Part_Id, S.Supplier_Name
FROM 部品P, 供給者S
WHERE P.Supplier_Id = S.Supplier_Id (+)

SELECT P.Part_Id, S.Supplier_Name
FROM 部品P, 供給者S
WHERE S.Supplier_Id (+) = P.Supplier_Id

どのように解決するには?

TableA LEFT OUTER JOIN TableB とは TableB RIGHT OUTER JOIN Table A .

オラクルでは (+) は JOIN のオプションテーブルを表します。つまり、最初のクエリでは P LEFT OUTER JOIN S . 2番目のクエリでは S RIGHT OUTER JOIN P . これらは機能的に同等です。

用語では、RIGHTまたはLEFTは結合のどちら側が常にレコードを持っているかを指定し、もう一方はNULLになる可能性があります。ですから P LEFT OUTER JOIN S , P にあるため、常にレコードがあります。 LEFT にあるからです。 S はnullである可能性があります。

参照 java2s.com にあるこの例 を参照してください。


明確にするために、私は、用語は視覚化を助けるためにあるに過ぎないので、重要ではないと言っているのだと思います。重要なのは、それがどのように機能するかという概念を理解することです。


右と左の比較

暗黙の結合構文において、RIGHTとLEFTを決定する際に何が重要であるかについて、いくつかの混乱を目にしました。

左外部結合

SELECT *
FROM A, B
WHERE A.column = B.column(+)

右外部結合

SELECT *
FROM A, B
WHERE B.column(+) = A.column

私がしたことは、WHERE句の項の側を入れ替えただけですが、それでも機能的には同じです。(それについての詳細は、私の回答の上の方を参照してください。) (+) の配置でRIGHTかLEFTかが決まります。 (+) が右側にある場合はLEFT JOINとなります。もし (+) が左側にある場合はRIGHT JOINです)。


JOINの種類

JOINのスタイルは次の2つです。 暗黙のJOIN 明示的JOIN . これらはJOINの書き方が異なりますが、機能的には同等です。

参照 このSOの質問 .

暗黙のJOIN は、単に全てのテーブルを一緒にリストアップします。結合条件はWHERE句で指定します。

暗黙のJOIN

SELECT *
FROM A, B
WHERE A.column = B.column(+)

明示的なJOIN は、WHERE句の代わりに、特定のテーブルを含む結合条件を関連付けます。

明示的なJOIN

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

これらの 暗黙的なJOINは読み解くのが難しく、また結合条件が他のWHERE条件と混在しているため、いくつかの制約があります。そのため、暗黙的なJOINは一般的に推奨されず、明示的な構文が好まれます。