1

本质上,我想从左表 (BO_HRO) 中选择两列中都包含 0 的匹配行或右表 (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)

我查看了几种解决方案,它们要么不太适合我的场景,要么不适用于我的情况。

4

2 回答 2

2

请试一试:

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)
于 2013-10-21T14:55:27.450 回答
1

“了解外连接非常重要,ON 和 WHERE 子句扮演着非常不同的角色,因此,它们不能互换。WHERE 子句仍然扮演着简单的过滤角色——即,它保留真实的情况并丢弃假和未知的情况。使用这样的东西,在where子句中使用谓词。但是,ON子句并没有起到简单的过滤作用,而是更多的匹配作用。换句话说,保留侧的一行将是返回 ON 谓词是否找到匹配项。因此,ON 谓词仅确定非保留端的哪些行与保留端的行匹配,而不是是否返回保留端的行。考试 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
于 2013-10-21T14:54:21.467 回答