2013-01-07 50 views
0

我不明白爲什麼我在運行SQL查詢時得到某些結果。這是查詢:SQL WHERE子句沒有過濾出空列

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) 

援助是在表A

主鍵下面是結果我得到:

flag type aID 
---- ---- ---- 
0 NULL NULL 

我本來期望那裏是沒有結果。我很困惑,因爲A.flag不是1,而B.type是null,這與我的WHERE子句相反。請注意,表B中此行沒有匹配項,因爲結果中B.aID爲空。當我只使用A.flag = 1B.type IS NOT NULL之一而不是兩者運行查詢時,不會返回任何結果而不是一個結果。

奇怪的是,當我用ISNULL(B.type,'X')替換SELECT語句中的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年1月7日的幫助下,我們可以從這個下面的查詢看到,有沒有進入在表B中對應於該開始日期。

SELECT * FROM B 
WHERE B.aID = 23844 

這不會返回任何結果。

使用,我們發現2012年11月23日援助的,我們可以看到,所有但其中一個在表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) 
+3

這真的是給你那些結果的查詢嗎?似乎不可能... –

+1

「flag」和「type」列的數據類型是什麼?我的意思是,你確定'type'的值不是'NULL'而是'NULL'而不是NULL? – Lamak

+0

@Lamak好點:) –

回答

-1

這是因爲你正在做一個左(外)連接。也許你想的是INNER JOIN?

+0

'WHERE'子句在'LEFT OUTER JOIN'後面的結果上運行,並且應該排除那些不匹配的任何行'(A.flag = 1或B.type IS NOT NULL)' –

0

原因是這是因爲此數據庫上沒有安裝Service Pack(2008)。其他安裝了SP1的數據庫不存在此問題。

+0

可能沒什麼關係用它做。如果問題是由於數據損壞而引起的,那麼您不會指望其他實例上的其他數據庫出現同樣的問題。我在這裏看不到「您的」問題[SQL Server 2008 Service Pack 1中修復的錯誤列表](http://support.microsoft.com/kb/968369) –