我在外面加入两张桌子。表1(LEAD)有689,189行,表2(CONTACT)有133,318行,它们的完整外连接返回738,959行。到目前为止,这是有道理的。
每个表都有一个字段,指示记录是否被逻辑删除,其值为Y
。我只想在两个表中返回值不等于Y
的行。当我向查询添加其他条件时
select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID and l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'
我得到的行数比没有它们要多。他们不应该使查询更具限制性吗?我知道我可以使用子查询来执行连接,但我只是不明白我是如何得出这个结果的。
答案 0 :(得分:0)
简短回答:改为将新标准放在where子句中。
select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID
where l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'
额外的连接条件是从连接另一侧的表中添加更多带空值的记录,从而产生额外的结果。
我不是100%确定如何处理只影响一方的条件的完全连接; l.DELETE_FLAG <> 'Y'
和c.DELETE_FLAG <> 'Y'
每个只查看联接中的两个表中的一个,我有理由确定这是原因。
答案 1 :(得分:0)
只需在WHERE子句中添加其他条件,如下所示:
select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID
where l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'
如果您的表包含NULL值,请按以下方式进行调整:
select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID
where (l.DELETE_FLAG <> 'Y' or l.DELETE_FLAG is NULL) and
(c.DELETE_FLAG <> 'Y' or c.DELETE_FLAG is NULL)