2012-02-29 3 views

答えて

9

いいえ、彼らが異なっている - 内部はTAB3に参加(後に左TAB2に参加する)最初のクエリで効果的に左に変わりは内部結合に戻っ参加します。

2番目のクエリの括弧内はTAB3に参加することを確認前左に評価され参加 - 対応TAB3レコードが(あるのみそれらTAB2レコードを返す、TAB2に参加するので、左のままそれ以外の場合、TAB1レコードは対応するNULLとともに返されます)。

+0

これは副作用ではありませんか?私はLEFTを書くときに、そのテーブルとすべての結合にLEFT結合をしたい。 –

+3

さて、あなたはいつでもOracle(と他のDBプロバイダとANSI)に書いて、彼らが間違っていると伝えることができます... –

+0

なぜ彼らはLEFTをINNERに変換しますか? –

2

何をしたいかもしれないことです:あなたはLEFT JOINを持った後、あなたの最初のクエリで

SELECT * 
FROM TAB1 
LEFT JOIN TAB2 
JOIN TAB3 
ON TAB3.ID = TAB2.ID_TAB3 
ON TAB2.ID_TAB1 = TAB1.ID; 

、それはON句を、関連付けられています、その全体に構築可能な結果セットに対してであるJOIN(あらゆる種類の)次の(すなわち、すでにTAB2TAB1に参加しています)。そして、次の結合は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を考える場合には、このクエリが何をするかを考える方が簡単かもしれません。次に、JOINONは、かっこが通常一致するのと同じ方法で一致します。

また、同じように、対応するONが見つかるまで、各結合句を「オープン」と見なすこともできます。しかし、ONJOINにマッチさせるルールは、最も近い「オープン」JOINを見つけることです。

どちらの方法でも、上記のクエリでは、最初のON句はTAB2TAB3の間の結合を満たします。次に、2番目のON句は、TAB1と結合された(TAB2TAB3)の間のLEFT JOINを満たします。

+0

これはoracleの構文が間違っています。 –

+0

@ CosminVacaroiu - それは何のエラーを与えるのですか? –

+0

わかりませんが、オンでも2オンでも参加することはできません –

関連する問題