我不明白为什么我在运行 SQL 查询时会得到某些结果。这是查询:
SELECT A.flag, B.type, B.aID
FROM A
LEFT JOIN B ON B.aID = A.aID
WHERE A.startDate = '2013-01-07'
AND (A.flag = 1 OR B.type IS NOT NULL)
aID 是表 A 上的主键。
这是我得到的结果:
flag type aID
---- ---- ----
0 NULL NULL
我原以为不会有结果。我很困惑,因为 A.flag 不是 1 而 B.type 是 null,这似乎与我的 WHERE 子句相反。请注意,表 B 上的该行没有匹配项,因为 B.aID 在结果中为空。当我只使用其中一个A.flag = 1
而B.type IS NOT NULL
不是两者运行查询时,没有返回结果而不是返回一个结果。
奇怪的是,当我将 SELECT 语句中的 B.type 替换为 ISNULL(B.type, 'X') 时,没有返回任何结果。当我添加AND B.type IS NOT NULL
到 LEFT JOIN 时也会发生同样的情况。
为什么我会得到这个结果?
编辑:示例数据
这是一个使用两个不同的开始日期从表 A 中获取行的查询:
SELECT * FROM A
WHERE A.startDate IN ('2013-01-07', '2012-11-23')
我得到以下结果(为清楚起见,省略了 6 列):
aID cID sID psID startDate flag
------- ---- ---- ---- ----------------------- -----
23844 75 72 86 2013-01-07 00:00:00 0
23940 75 72 86 2012-11-23 00:00:00 1
21061 76 73 87 2012-11-23 00:00:00 0
21293 76 74 88 2012-11-23 00:00:00 0
21477 77 75 89 2012-11-23 00:00:00 0
21711 78 76 90 2012-11-23 00:00:00 0
21944 79 77 91 2012-11-23 00:00:00 0
22176 80 78 92 2012-11-23 00:00:00 0
22410 81 79 93 2012-11-23 00:00:00 0
22643 82 80 94 2012-11-23 00:00:00 0
23344 83 81 95 2012-11-23 00:00:00 0
22876 84 82 96 2012-11-23 00:00:00 0
23639 85 83 97 2012-11-23 00:00:00 0
23109 89 84 98 2012-11-23 00:00:00 0
(14 row(s) affected)
使用我们为 2013-01-07 找到的 aID,我们可以从下一个查询中看到表 B 中没有对应于该开始日期的条目。
SELECT * FROM B
WHERE B.aID = 23844
这不返回任何结果。
使用我们在 2012 年 11 月 23 日找到的 aID,我们可以看到除了其中一个之外,所有这些都在表 B 中具有相应的条目。
SELECT * FROM B
WHERE B.aID IN (23940,
21061,
21293,
21477,
21711,
21944,
22176,
22410,
22643,
23344,
22876,
23639,
23109)
结果:
bID aID type duration iMinutes
----- ------ ----- -------- ---------
5836 21061 M 0 0
5893 21293 M 0 0
5916 21477 M 0 0
5975 21711 M 0 0
6033 21944 M 0 0
6092 22176 M 0 0
6150 22410 M 0 0
6208 22643 M 0 0
6266 22876 M 0 0
6530 23109 M 0 0
6382 23344 M 0 0
6478 23639 M 0 0
(12 row(s) affected)