首页 > 解决方案 > WHERE 子句未命中 LEFT JOIN

问题描述

我正在尝试从 who 中选择ID, a, who以及b来自who和 who 字段DatabaseAlphaIS_CURRENT = 'y'任何数据。我使用 a 是因为所有s in都会有一个对应的 in 。但并不是所有的 s in都会有 in (因此,我希望在右侧的查询中返回)。per (但多个)只有一个实例。DatabaseBravoIDDatabaseAlphaIS_CURRENT = 'Y'LEFT JOINIDDatabaseBravoDatabaseAlphaIDDatabaseAlphaDatabaseBravoNULLSIS_CURRENT = 'Y'IDIS_CURRENT = 'N'

我有一个查询如下:

SELECT ID, a, b 
FROM DatabaseAlpha x
LEFT JOIN DatabaseBravo y ON x.ID = y.ID
                          AND x.IS_CURRENT = 'Y' 
                          AND y.IS_CURRENT = 'Y'

然而,结果并不是我想要的。ID此查询显示来自我的DatabaseAlpha表和NULL来自的多个具有相同的条目DatabaseBravo,同时具有IS_CURRENT = 'Y'IS_CURRENT = 'N'

例如,采取ID = 357. 有 6 个条目,DatabaseAlpha其中ID0个DatabaseBravo。在 6 个条目中,其中 5 个有IS_CURRENT = 'N',只有一个有IS_CURRENT = 'Y'。我想要的结果是只IS_CURRENT = 'Y'为返回此 ID 的条目。但是,查询的实际结果是返回所有 6 个条目,包括IS_CURRENT = 'N'.

我尝试以三种方式更改我的查询,但都失败了:

WHERE x.IS_CURRENT = 'Y' AND y.IS_CURRENT = 'Y'
WHERE x.IS_CURRENT = 'Y' OR y.IS_CURRENT = 'Y'
AND x.IS_CURRENT = 'Y' OR y.IS_CURRENT = 'Y'

我做错了什么或没有看到这里?

标签: sqlsql-server

解决方案


您需要将部分join条件移至where标准:

SELECT ID, a, b 
FROM DatabaseAlpha x
    LEFT JOIN DatabaseBravo y on x.ID = y.ID and y.IS_CURRENT = 'Y'
WHERE x.IS_CURRENT = 'Y' 

这将返回DatabaseAlpha表中匹配的所有记录,is_current = 'Y'并且因为您使用的是outer join,所以只有那些与join条件匹配的记录才会从 中返回DatabaseBravo,在这种情况下is_current = 'Y'也是如此。


推荐阅读