SQL在左连接...和左连接on..where之间有所不同

时间:2017-06-22 09:54:58

标签: sql join

我有两个sql连接两个表:

select top 100 a.XXX
              ,a.YYY
              ,a.ZZZ
              ,b.GGG
              ,b.JJJ
from table_01 a 
    left join table_02 b
        on a.XXX = b.GGG
            and b.JJJ = "abc"
            and a.YYY between '01/08/2009 13:18:00' and '12/08/2009 13:18:00'
select top 100 a.XXX
              ,a.YYY
              ,a.ZZZ
              ,b.GGG
              ,b.JJJ 
from table_01 a 
    left join table_02 b
        on a.XXX = b.GGG 
where b.JJJ = "abc"
    and a.YYY between '01/08/2009 13:18:00' and '12/08/2009 13:18:00'

他们的结果不同但我不明白其原因 如果我能在这里得到一些帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

每当您使用LEFT JOIN时,有关正确表格内容的所有条件都应在ON子句中,否则您有效地将LEFT JOIN转换为{{1} }}

原因是当使用INNER JOIN时,将返回左表中的所有行。如果它们与右表匹配,则也将返回匹配行的值,但如果它们与右表中的任何行不匹配,则右表将返回{{1行值 由于您无法将任何内容与LEFT JOIN(甚至不是另一个null)(Read this answer to find out why)进行比较,因此您基本上是在告诉您的数据库返回两个表中匹配的所有行。 /> 但是,当条件在NULL子句中时,您的数据库知道将其视为连接条件的一部分。