何をしたいかもしれないことです:あなたはLEFT JOIN
を持った後、あなたの最初のクエリで
SELECT *
FROM TAB1
LEFT JOIN TAB2
JOIN TAB3
ON TAB3.ID = TAB2.ID_TAB3
ON TAB2.ID_TAB1 = TAB1.ID;
、それはON
句を、関連付けられています、その全体に構築可能な結果セットに対してであるJOIN
(あらゆる種類の)次の(すなわち、すでにTAB2
とTAB1
に参加しています)。そして、次の結合はINNER JOIN
であるため、結合が完全に完了するまで完全に満足しなければなりません。
上記のクエリでは、私はLEFT JOIN
を導入しましたが、左結合の「右手側」でさらに結合を完了するまで、関連するON
句を導入しないでください。
Oracle Expressをダウンロードするだけで済みます。このスクリプト:
CREATE TABLE TAB1 (
ID int not null
);
CREATE TABLE TAB2 (
ID_TAB1 int not null,
ID_TAB3 int not null
);
CREATE TABLE TAB3 (
ID int not null
);
INSERT INTO TAB1 (ID) VALUES (1);
INSERT INTO TAB1 (ID) VALUES (2);
INSERT INTO TAB3 (ID) VALUES (1);
INSERT INTO TAB3 (ID) VALUES (2);
INSERT INTO TAB2 (ID_TAB1,ID_TAB3) VALUES (2,2);
SELECT *
FROM TAB1
LEFT JOIN TAB2
JOIN TAB3
ON TAB3.ID = TAB2.ID_TAB3
ON TAB2.ID_TAB1 = TAB1.ID;
期待通りに動作しました。
あなたは左括弧(
を導入し、ON
は右括弧)
を導入するようJOIN
を考える場合には、このクエリが何をするかを考える方が簡単かもしれません。次に、JOIN
とON
は、かっこが通常一致するのと同じ方法で一致します。
また、同じように、対応するON
が見つかるまで、各結合句を「オープン」と見なすこともできます。しかし、ON
をJOIN
にマッチさせるルールは、最も近い「オープン」JOIN
を見つけることです。
どちらの方法でも、上記のクエリでは、最初のON
句はTAB2
とTAB3
の間の結合を満たします。次に、2番目のON
句は、TAB1
と結合された(TAB2
とTAB3
)の間のLEFT JOIN
を満たします。
これは副作用ではありませんか?私はLEFTを書くときに、そのテーブルとすべての結合にLEFT結合をしたい。 –
さて、あなたはいつでもOracle(と他のDBプロバイダとANSI)に書いて、彼らが間違っていると伝えることができます... –
なぜ彼らはLEFTをINNERに変換しますか? –