WHERE子句未在LEFT JOIN上生效

时间:2018-12-13 15:04:02

标签: sql sql-server

我试图从ID的{​​{1}}中选择abDatabaseAlpha,以及{与IS_CURRENT = 'y'相同的DatabaseBravo,其字段ID。我之所以使用DatabaseAlpha,是因为IS_CURRENT = 'Y'中的所有LEFT JOIN将在ID中具有一个对应的位置。但并非DatabaseBravo中的所有DatabaseAlpha都将在ID中启用(因此,我希望DatabaseAlpha在右侧的查询中返回)。每个DatabaseBravo只有一个NULLS实例(但多个IS_CURRENT = 'Y')。

我有一个查询,如下所示:

ID

但是,结果不是我想要的。该查询显示了多个条目,它们来自我的IS_CURRENT = 'N'表中的SAME 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的{​​{1}},同时具有DatabaseAlphaNULL

例如,取DatabaseBravoIS_CURRENT = 'Y'中有6个条目带有此IS_CURRENT = 'N',而ID = 357中有0个条目。在6个条目中,其中5个具有DatabaseAlpha,只有一个具有ID。我想要的结果仅是带有DatabaseBravo的条目才能返回此ID。但是,该查询的实际结果是返回了所有6个条目,包括表示IS_CURRENT = 'N'的条目。

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

IS_CURRENT = 'Y'

我做错了什么还是没在这里看到吗?

1 个答案:

答案 0 :(得分:4)

您需要将部分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'