2015-10-26 69 views
2

我很難理解這兩個查詢之間的區別。不要給出相同的結果,只是結果略有不同。這兩個查詢不是相同的,但只是倒過來?你可以在最後一個子查詢中看到不同之處。這兩個查詢的區別(存在不類似而不存在的類似)

SELECT * 
FROM[dbo].[MNO International AB$Item] t1 
WHERE 
    t1.[Item Type] = 0 
    AND (
      NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3) 
      OR t1.[Statistics Group] = 0 
     ) --Result: 2178 

    AND NOT EXISTS 
       (SELECT * FROM [dbo].[MNO International AB$Master] t2 
       WHERE t1.[Master No_] = t2.No_ 
       AND t2.[Collection No_] LIKE 'NEW-NOS' 
       ) 

其他查詢

SELECT * 
FROM[dbo].[MNO International AB$Item] t1 
WHERE 
    t1.[Item Type] = 0 
    AND (
      NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3) 
      OR t1.[Statistics Group] = 0 
     ) --Result: 2178 

    AND EXISTS 
       (SELECT * FROM [dbo].[MNO International AB$Master] t2 
       WHERE t1.[Master No_] = t2.No_ 
       AND t2.[Collection No_] NOT LIKE 'NEW-NOS' 
       ) 

+0

你有一個環境下複製呢? – Dane

+0

「不要給出相同的結果」 - 你也不應該指望它們。這可能有點麻煩,但請看維基百科的存量定量的否定部分(https://en.wikipedia.org/wiki/Existential_quantification#Negation)。查詢一個是「有* no *項目,比如'NEW-NOS'」,查詢二是「至少有一個*項目*不像* NEW-NOS'」 –

+0

第二個查詢包含一個「不像「條款而不是」贊「,所以它不是倒置。如果該條款是「喜歡」,那麼第二個將是第一個的倒置。 – Takarii

回答

2

我想結果會給出不一樣的。因爲:

NOT(A = B AND C <> D) 
= NOT(A = B) OR NOT(C <> D) 
= A <> B OR C = D 

返回查詢:

NOT EXISTS (t1.[Master No_] = t2.No_ AND t2.[Collection No_] NOT LIKE 'NEW-NOS') 
= EXISTS (t1.[Master No_] <> t2.No_ OR t2.[Collection No_] LIKE 'NEW-NOS') 
+0

最簡單的例子來說明差異。當MNO International AB $ Master是空的時候會發生什麼? – Taemyr

+0

如果MNO國際AB $碩士是空的,在哪裏總是返回NULL的第二個子查詢。 (SELECT NULL) - >總是返回TRUE EXISTS(SELECT NULL) - > always return FALSE –

+0

是的,因此它是一個簡單的例子。 – Taemyr

相關問題