sql - WHERE 子句未命中 LEFT JOIN
问题描述
我正在尝试从 who 中选择ID
, a
, who以及b
来自who和 who 字段DatabaseAlpha
的IS_CURRENT = 'y'
任何数据。我使用 a 是因为所有s in都会有一个对应的 in 。但并不是所有的 s in都会有 in (因此,我希望在右侧的查询中返回)。per (但多个)只有一个实例。DatabaseBravo
ID
DatabaseAlpha
IS_CURRENT = 'Y'
LEFT JOIN
ID
DatabaseBravo
DatabaseAlpha
ID
DatabaseAlpha
DatabaseBravo
NULLS
IS_CURRENT = 'Y'
ID
IS_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
其中ID
0个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'
我做错了什么或没有看到这里?
解决方案
您需要将部分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'
也是如此。
推荐阅读
- c# - .NET 4.7.2 中使用 C# 的 AES GCM 加密
- google-analytics - gtag.js 事件跟踪 - 跟踪代码片段的位置
- android - 使用 retrofit2 和 rxjava2 对 android 应用程序进行单元测试
- reactjs - 无法在反应 js 中为按钮添加 Tippy
- robotframework - 如何计算行数并进行比较以获得通过的结果
- angular - 级联下拉填充方法在 Angular 7 中运行多个
- flutter - 如何在颤动中修复文本滚动图像
- xml - 来自 SQL 查询的休眠映射文件
- reactjs - 如何使用 React 加入状态中的多个 Apollo 查询?
- c++ - 为什么这个 C++ 包装类没有被内联?