基本上我想从左表(BO_HRO)中选择数据,这些数据在两列中都有匹配的行,或者在右表中不存在行(BO_HRO_EXT)。
但是,下面列出的查询可以处理左连接的行为,并返回左表中的所有行,无论它们是否存在于右表中。
SELECT preventable, warrantable
FROM BO_HRO LEFT JOIN BO_HRO_EXT
ON BO_HRO.RO_NO = BO_HRO_EXT.RO_NO AND
(preventable = 0 OR preventable IS NULL) AND
(warrantable = 0 OR warrantable IS NULL)
我已经查看了几个解决方案,要么它们不适合我的情况,要么就我的情况不起作用。
答案 0 :(得分:1)
“非常重要的是要理解,使用外连接时,ON和WHERE子句会起作用 角色非常不同,因此,它们不可互换。 WHERE子句仍然起作用 简单的过滤角色 - 即保持真实案例并丢弃虚假和未知案件。 使用类似的东西并在where子句中使用谓词。 但是,ON子句不起简单的过滤作用;相反,它更像是匹配 角色。换句话说,无论是ON谓词,都将返回保留一侧的行 找到匹配与否。因此ON谓词仅确定来自非保留的行 side与保留端的行匹配 - 不管是否返回行 从保留的一面。“考试70-461:查询Microsoft SQL Server 2012
使用类似的东西并在where子句中使用谓词。
SELECT preventable, warrantable
FROM BO_HRO LEFT JOIN BO_HRO_EXT
ON BO_HRO.RO_NO = BO_HRO_EXT.RO_NO
where(preventable = 0 AND warrantable = 0 )
OR (BO_HRO_EXT.RO_NO IS NULL
答案 1 :(得分:1)
请试一试:
SELECT
preventable,
warrantable
FROM
BO_HRO
LEFT JOIN BO_HRO_EXT ON BO_HRO.RO_NO = BO_HRO_EXT.RO_NO
WHERE
(preventable = 0 AND warrantable = 0 )
OR (BO_HRO_EXT.RO_NO IS NULL)