2014-06-11 68 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中至少没有一个匹配你的连接谓词。