T-SQL从连接中选择空值

时间:2013-10-21 14:49:54

标签: sql-server tsql

基本上我想从左表(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)

我已经查看了几个解决方案,要么它们不适合我的情况,要么就我的情况不起作用。

2 个答案:

答案 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)