[解決済み] Oracle 11gで+記号を使用した左外部結合
質問
以下の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は一般的に推奨されず、明示的な構文が好まれます。
関連
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
-
[解決済み] LEFT OUTER JOINはどのように左のテーブルに存在するよりも多くのレコードを返すことができますか?
-
[解決済み] 左外部結合から返されるデフォルトの Null 値の置き換え
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] 明示的なSQLの結合と暗黙的なSQLの結合
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] オラクル「(+)」。演算子