0

我不明白为什么我在运行 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 = 1B.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)
4

2 回答 2

0

事实证明,这是因为该数据库(2008 年)上没有安装服务包。其他安装了 SP1 的数据库没有这个问题。

于 2013-01-08T21:05:04.447 回答
-1

It's because you are doing a LEFT (OUTER) JOIN. Perhaps an INNER JOIN is what you had in mind?

于 2013-01-08T09:01:08.847 回答