特異なOracle外部結合構文のケース


16

Oracleの外部結合構文からSQL標準の外部結合構文に移植されることになっているクエリで、次のことがわかりました。

SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)

現在、外部結合構文の翻訳は通常非常に機械的なプロセスですが、その最後の行は私を困惑させました。どういう意味ですか?どのような効果がありますか?

回答:


11

機械的なプロセスを実行しようとしました。私はそれを正しく覚えていると思います。

これはにつながります:

SELECT ...
FROM A
         join B on A.A_ID = B.A_ID
    left join C on B.B_ID = C.A_ID and B.B_KEY = C.B_KEY and 'CONSTANT' = C.X_ID
    left join D on C.C_ID = D.C_ID
    left join E on B.A_ID = E.A_ID and B.B_KEY = E.B_KEY

要するに、Leigh Riffelの答えは正しいと思う。

注意

昔は、記憶するルールは次のとおりでした。SQLServerの古い構文ではAa = Bb(+)がAa * = Bbになり、プラスが反対側に移動して星になります。


10

この行では、c.X_IDが定数値に等しいか、Cテーブルのレコードが存在しないことが必要です。もちろん、結合されたままなので、Aテーブルのレコードは制限されず、結合されるCテーブルのレコードのみが制限されます。デモは次のとおりです。

セットアップ:

CREATE TABLE T1 as (select rownum+1 t1_id from dual connect by rownum <= 4);
CREATE TABLE T2 as (
   select rownum t1_id, DECODE(rownum,2,'CONSTANT',3,'NoMatch') CompareField 
   from dual connect by rownum <= 3
);
SELECT * FROM T1;
SELECT * FROM T2;

結果:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1, T2
WHERE T1.t1_id = T2.t1_id(+)
AND 'CONSTANT' = T2.CompareField(+)
ORDER BY 1;

または:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1 LEFT JOIN T2 ON T1.t1_id = T2.t1_id 
AND 'CONSTANT' = T2.CompareField
ORDER BY 1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.