2013-10-29 56 views
0

嗨,我不知道它爲什麼會產生不同的結果。有人能讓我知道我的錯誤是什麼?不存在和不在SQL服務器

該查詢返回2行的記錄

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
WHERE Prod.intDepartmentRef =4 

bintProductRef 
-------------------- 
164475 
164476 

和記錄

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE intCatRef = 132 

bintProductRef 
-------------------- 
164475 

NOT EXISTS的這個查詢返回1行,當結合上面的2個查詢,它應該返回164476,但沒有輸出。

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE Prod.intDepartmentRef =4 
     AND NOT EXISTS (  
     SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE intCatRef = 132) 

NOT IN,這回1行數據,這是164476,這是正確的。

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE Prod.intDepartmentRef =4 
     AND Prod.bintProductRef NOT IN (  
     SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE intCatRef = 132) 
+0

http://stackoverflow.com/questions/173041/not-in-vs-not-exists –

回答

1

在您的「NOT EXISTS」中,您的主要查詢與NOT EXISTS中的子查詢之間沒有任何關聯。

不存在評估你的子查詢,它選擇了一些東西,因此「東西」存在,你的NOT EXISTS將是假的,沒有行返回。

如果您希望使用EXISTS,則需要將兩個查詢鏈接在一起;像這樣:

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod 
WHERE intDepartmentRef =4 
AND NOT EXISTS (  
    SELECT 1 FROM Prod_ProfileTbl Prod2  
    WHERE intCatRef = 132 AND prod.intCatRef = prod2.intCatRef) 

,但爲了您的目的,NOT IN或類似是更好的方法。

0

不存在(...)意味着只有當括號中的內容不包含任何內容時纔會成立。如你所示,它確實返回一行,因此NOT EXISTS是錯誤的,因此AND爲假,並且不會返回任何行。

0
SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE Prod.intDepartmentRef =4 
     AND NOT EXISTS (  
     SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
     WHERE intCatRef = 132) 

這部分代碼有一個邏輯,它比Prod.intDepartmentRef = 4,查詢不應該存在以返回結果。注意兩個謂詞應該是真的,所以where子句變爲真。但也並不是說這個查詢:

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod  
      WHERE intCatRef = 132 

存在一個有結果,因此第二個謂語爲假,你必須:真假--->假的,所以沒有結果返回。

相關問題