我不明白为什么我在运行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.NULL(B.type,'X')替换B.type时,不返回任何结果。当我将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,我们可以看到除了其中一个以外的所有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)
答案 0 :(得分:0)
事实证明这种情况正在发生,因为此数据库上没有安装Service Pack(2008)。安装了SP1的其他数据库没有此问题。
答案 1 :(得分:-1)
这是因为你正在进行LEFT(OUTER)JOIN。也许INNER JOIN就是您的想法?