我们在用多表连接的时候(这里我们主要讨论外连接),有些时候可以在连接条件加上其他设定,比如:Select *
From Table1 t1
Left Join Table2 t2 On t1.SomeCol_1 = t2.SomeCol_2 AND t2.SomeCol_3 = 'SomeString1'
Left Join Table2 t3 On t2.SomeCol_4 = t3.SomeCol_5 AND t3.SomeCol_6 = 'SomeString2'和Select *
From Table1 t1
Left Join Table2 t2 On t1.SomeCol_1 = t2.SomeCol_2
Left Join Table3 t3 On t2.SomeCol_4 = t3.SomeCol_5
Where t2.SomeCol_3 = 'SomeString1' AND t3.SomeCol_6 = 'SomeString2'之间到底有什么区别?因为他们产生不同的结果集,一般情况下前者会比后者的结果集更大。查了一些资料好像说是在条件判断顺序不同而产生了差异。为了弄得清楚明白,特此请教各位高手,麻烦你们帮忙解释一下,非常非常感谢!人格担保迅速结贴。

解决方案 »

  1.   

    第一种情况:
    选出Table1的全部记录第二种情况:
    选出Table1中联接字段符合where条件的记录
      

  2.   

    ON 后边跟的是联接条件,where后面跟的是筛选条件,如果在inner join语句中,效果是一样的,但是在外连接语句中,先按照外联接的条件生成结果集,再根据WHERE条件筛选。
      

  3.   

    (1)
    Select *
    From Table1 t1
    Left Join Table2 t2 On t1.SomeCol_1 = t2.SomeCol_2 AND t2.SomeCol_3 = 'SomeString1'
    Left Join Table2 t3 On t2.SomeCol_4 = t3.SomeCol_5 AND t3.SomeCol_6 = 'SomeString2'(2)
    Select *
    From Table1 t1
    Left Join Table2 t2 On t1.SomeCol_1 = t2.SomeCol_2
    Left Join Table3 t3 On t2.SomeCol_4 = t3.SomeCol_5
    Where t2.SomeCol_3 = 'SomeString1' AND t3.SomeCol_6 = 'SomeString2'
    (1)中的t2.SomeCol_3 = 'SomeString1'仅仅限定Table2 t2的数据,即对于t1有而t2没有的数据,是不过滤掉这部分数据的。
    t3.SomeCol_6 = 'SomeString2'同理。(1)中的t2.SomeCol_3 = 'SomeString1'在t1与t2连接生成的数据集后过滤数据,因为此时可能存在t1有而t2为空的数据,也会过滤掉这部分数据。
    t3.SomeCol_6 = 'SomeString2'同理。而对于inner join限定条件放在连接条件或放在Where条件效果相同。亦即楼上老大说的:ON 后边跟的是联接条件,where后面跟的是筛选条件,如果在inner join语句中,效果是一样的,但是在外连接语句中,先按照外联接的条件生成结果集,再根据WHERE条件筛选。