2017-02-11 9 views
0

どのようにしてEXISTSが機能するのか理解しようとしています。HAVING句でサブクエリが存在する

次のクエリはthis回答に基づいて、それはリースで、これらのレコードの1つがOrderQty > 1ProductID = 777を持つテーブルで1つの以上のレコードを持っているすべてのSalesOrderID秒、のために照会されます。

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の束です。なぜ\どのように、外部クエリはSales.SalesOrderDetailの一部のみを返し、その全体は返しません。

+1

サブクエリの 'WHERE'条件のためです。これは*相関サブクエリ*と呼ばれます。 –

+0

@ GordonLinoffは、 'GROUP BY'が必要ですか?それがなければ同じ結果が得られます。 – HeyJude

答えて

0

EXISTSでは、外側のテーブルのレコードが内側のクエリで指定された条件を満たすかどうかをチェックするだけです。そのため、個々の列を指定する必要があるINとは異なり、 "1"を指定します(データは各レコードごとにチェックされます)。

したがって、1の束を返して、それを検証しません。名前が示すように、与えられた条件に従ってレコードの存在のみをチェックします。

これは明らかです。

注:あいまいさを防ぐため、必ず列に表の別名を使用してください。

0

インナーSELECT 1 ...は常に内部WHERE/HAVING条件はあなたが1を取得することはありません満たされていない1

が返さ戻りません。 SQL Server Management Studio(正しくリコールした場合)は、結果が全く表示されず、内部のNULLでなくてもSELECT 1というように、その特定の行の外部全体が異常終了します。

したがって、外部クエリ結果セットの一部が切り捨てられ、EXITS(...)で返される行の総数は、EXISTS(...)が存在しない場合には少なくなります。

関連する問題