2017-02-11 61 views
0

我試圖瞭解如何EXISTS工作。存在與HAVING子句的子查詢

下面的查詢基於this答案,它查詢所有SalesOrderID s表示在表中有超過1分的記錄,其中以租賃的那些記錄一個具有OrderQty > 1ProductID = 777

USE AdventureWorks2012; 
GO 
SELECT SalesOrderID, OrderQty, ProductID 
FROM Sales.SalesOrderDetail s 
WHERE EXISTS 
     ( SELECT 1 
      FROM Sales.SalesOrderDetail s2 
      WHERE s.SalesOrderID = s2.SalesOrderID 
      GROUP BY SalesOrderID 
      HAVING COUNT(*) > 1 
      AND COUNT(CASE WHEN OrderQty > 1 AND ProductID = 777 THEN 1 END) >= 1 
     ); 

什麼我不明白是這樣的:子查詢返回每行填充值爲1的單列圓桌。所以我理解它的方式,外層查詢中的WHERE沒有適用的實際條件,只是一堆1 s。爲什麼\然後,外部查詢只返回Sales.SalesOrderDetail的一部分,而不是全部?

+1

由於子查詢中的WHERE條件。這被稱爲*相關子查詢*。 –

+0

@GordonLinoff,是否需要'GROUP BY'?沒有它,它會得到相同的結果。 – HeyJude

回答

0

在EXISTS中發生的情況是,它只檢查外部表中的記錄是否滿足內部查詢中給出的條件。這就是爲什麼我們指定「1」,而不像IN那樣我們需要指定單個列(並且爲每個記錄檢查數據)。

所以,它不會返回任何一串1並驗證它。正如名字所暗示的那樣,它只根據給定的條件檢查記錄的存在。

希望澄清。

注意:始終爲列使用表別名以避免歧義。

0

SELECT 1 ...不會始終返回1

當內WHERE/HAVING條件沒有被滿足,你不會得到1返回。相反,不會有任何東西,我的意思是SQL Server Management Studio(如果我記得正確的話)將根本不顯示任何結果,對於內部SELECT 1甚至不顯示NULL,因此不能針對該特定行對整個外部WHERE進行失敗。

因此,如果EXISTS(...)不存在,那麼您的外部查詢結果集的一部分將被截斷,並且與EXITS(...)一起返回的行總數將會減少。