为什么SQL中的最后一行会有所不同

为什么SQL中的最后一行会有所不同,sql,Sql,我正试着选择广告曝光的一些部分 有两个类似的SQL代码,只有一行不同,但输出不同 代码1 代码2 这两部分之间的唯一区别是显而易见的 (其中req.lineitemid!='something'),则imp表中的expo_freq是不同的。但是经过检查,在表中的某个其他表格中,“某物”根本不存在,这意味着它应该会影响任何东西!那么为什么这一行会影响SQL的答案呢? 顺便说一句,如果我把这行放在req表单中,结果将与code1相同 代码3看起来像这样 select req.bucket ,imp.

我正试着选择广告曝光的一些部分

有两个类似的SQL代码,只有一行不同,但输出不同

代码1

代码2

这两部分之间的唯一区别是显而易见的 (其中req.lineitemid!='something'),则imp表中的expo_freq是不同的。但是经过检查,在表中的某个其他表格中,“某物”根本不存在,这意味着它应该会影响任何东西!那么为什么这一行会影响SQL的答案呢? 顺便说一句,如果我把这行放在req表单中,结果将与code1相同 代码3看起来像这样

select req.bucket
,imp.expo_freq
,imp.platform
from some_adform imp
left join (select * from some_other_adform where req.lineitemid!='something') req
    on imp.requestid=req.requestid
;

因为当把语句放在where子句中时,这意味着表中必须有一行保持连接,语句才能进行计算——实际上,这使它成为一个内部连接

如果将其作为条件放在左联接(as和…)中,则仅对左联接表中的匹配行求值:

select req.bucket,imp.expo_freq,imp.platform
from some_adform imp
left join some_other_adform req
  on imp.requestid=req.requestid
  and req.lineitemid!='something';
作为补充说明,如果您添加了空检查,您将得到相同的结果:

select req.bucket,imp.expo_freq,imp.platform
from some_adform imp
left join some_other_adform req
  on imp.requestid=req.requestid
where ISNULL(req.lineitemid,'')!='something';

因为当把语句放在where子句中时,这意味着表中必须有一行保持连接,语句才能进行计算——实际上,这使它成为一个内部连接

如果将其作为条件放在左联接(as和…)中,则仅对左联接表中的匹配行求值:

select req.bucket,imp.expo_freq,imp.platform
from some_adform imp
left join some_other_adform req
  on imp.requestid=req.requestid
  and req.lineitemid!='something';
作为补充说明,如果您添加了空检查,您将得到相同的结果:

select req.bucket,imp.expo_freq,imp.platform
from some_adform imp
left join some_other_adform req
  on imp.requestid=req.requestid
where ISNULL(req.lineitemid,'')!='something';

因为
NULL
使
WHERE
子句中将外部联接转换为内部联接的条件失败

这通常通过将条件移动到
ON
子句中来解决:

select req.bucket, imp.expo_freq, imp.platform
from some_adform imp left join
     some_other_adform req
     on imp.requestid = req.requestid and
        req.lineitemid <> 'something';
选择请求桶、imp.expo\u频率、imp.platform
从某个小鬼的左连接
一些其他形式的需求
在imp.requestid=req.requestid和
req.lineitemid“某物”;

NULL
s可能会有点混乱。几乎所有比较都返回
NULL
,在
WHERE
条件下,该值被视为false。这对于
=

一样适用,因为
NULL
使
WHERE
子句中将外部联接转换为内部联接的条件失败

这通常通过将条件移动到
ON
子句中来解决:

select req.bucket, imp.expo_freq, imp.platform
from some_adform imp left join
     some_other_adform req
     on imp.requestid = req.requestid and
        req.lineitemid <> 'something';
选择请求桶、imp.expo\u频率、imp.platform
从某个小鬼的左连接
一些其他形式的需求
在imp.requestid=req.requestid和
req.lineitemid“某物”;
NULL
s可能会有点混乱。几乎所有比较都返回
NULL
,在
WHERE
条件下,该值被视为false。这与
=
一样适用

但是在检查之后,在表中一些其他表格要求“某物” 根本不存在,这意味着它应该影响任何事情

这是不正确的。
您正在执行一个
左联接
,因此表中的许多行
其他adform
可能不匹配,因此它们将被
null
s填充。
条件:

where req.lineitemid!='something'
删除
null
s也是因为将
null
结果与
null
进行比较,因此
WHERE
子句中的条件为not
true
,并且不会返回该行
尝试:

where req.lineitemid!='something' or req.lineitemid is null
这将产生您想要的结果

但是在检查之后,在表中一些其他表格要求“某物” 根本不存在,这意味着它应该影响任何事情

这是不正确的。
您正在执行一个
左联接
,因此表中的许多行
其他adform
可能不匹配,因此它们将被
null
s填充。
条件:

where req.lineitemid!='something'
删除
null
s也是因为将
null
结果与
null
进行比较,因此
WHERE
子句中的条件为not
true
,并且不会返回该行
尝试:

where req.lineitemid!='something' or req.lineitemid is null

这将产生您想要的结果。

WHERE子句包含一个附加限制。您不希望这两个查询具有不同的行为吗?顺便说一句,您可能想将
WHERE
子句中的逻辑移到join的
ON
子句中。我可以知道附加限制的更多详细信息吗?我在代码3中将where子句移到on子句,但没有理解它们为什么不同,谢谢你的回答!
WHERE
子句包含一个附加限制。您不希望这两个查询具有不同的行为吗?顺便说一句,您可能想将
WHERE
子句中的逻辑移到join的
ON
子句中。我可以知道附加限制的更多详细信息吗?我在代码3中将where子句移到on子句,但没有理解它们为什么不同,谢谢你的回答<代码>其中空“foo”为false?@Cid。不,它是
NULL
,在
WHERE
条件中被视为false。好的,因此
是NULL
条件
其中NULL'foo'
是false?@Cid。不,它是
NULL
,在
WHERE
条件中被视为false。好的,因此
是NULL
条件