2014-06-11 92 views
-1

在下面的查詢中,我想將外部連接留在table3上。不應該導致ID大於table1中的表ID的所有行。爲什麼我的SQL查詢不能正常工作?

這對我來說應該返回table3中所有大於table1 ID的行。那麼情況並非如此。

問題:這是否應該返回所有具有 大於table1 ID的ID的行?

注:我知道,從條款 在周圍切換表的順序會改變所產生的數據集。

select t1.ID, t1.Value, 
     t3.ID, t3.Value 
from table1 as t1 
     left outer join 
    table3 as t3 on t1.ID > t3.ID; 

結果:

1 First NULL NULL 
    2 Second  1 First 

表1:

ID Value 
    1 First 
    2 Second 

表3:

ID Value 
    1 First 
    2 Second 
    3 Third 
    4 Fourth 
    5 Fifth 
    6 Sixth 
    7 Seventh 
    8 Eighth 

此查詢返回結果表,我認爲它應該用於此類查詢。但第一個例子並不像我認爲的那樣工作。因爲這會匹配所有正確的tabel,其ID小於當前的t1.ID,這是它應該如何工作的。 (看上面)

select t1.ID, t1.Value, 
     t3.ID, t3.Value 
from table1 as t1 
     left outer join 
    table3 as t3 on t1.ID < t3.ID; 

結果:

1 First 2 Second 
    1 First 3 Third 
    1 First 4 Fourth 
    1 First 5 Fifth 
    1 First 6 Sixth 
    1 First 7 Seventh 
    1 First 8 Eighth 
    2 Second 3 Third 
    2 Second 4 Fourth 
    2 Second 5 Fifth 
    2 Second 6 Sixth 
    2 Second 7 Seventh 
    2 Second 8 Eighth 
+0

所以**你認爲第一個結果集有什麼錯誤? – podiluska

+0

'x> y'表示'x'大於'y'。再看看你在''''的兩邊有什麼。 –

回答

2

在第一種情況下,你會得到在T1和T3,其中T1 ID大於行的每個組合的結果,但如果NO將在t1中爲行生成行,從t1中獲得行,併爲t3行中的所有NULL。

因此,「1,首先」排在T1不高於T3任何行更大,你會得到這樣的輸出結果:

1,首先,NULL,NULL

對於在「2秒」排在T1,它的id是比「1,首先」在T3行更大,所以你得到這個輸出結果:

2,二,1,首先

這一切都如預期。

您的第二個查詢也按預期工作 - 對於您所擁有的數據集,結果與您使用INNER JOIN而不是LEFT JOIN完全相同,因爲您在t1中沒有任何行在t3中至少沒有一個匹配你的連接謂詞。