【发布时间】:2017-02-11 17:38:56
【问题描述】:
我正在尝试了解 EXISTS 的工作原理。
下面的查询是基于this的答案,它会查询所有SalesOrderIDs在表中有超过1条记录,其中至少一条记录有OrderQty > 1和ProductID = 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 没有实际应用条件,只是一堆1s。为什么\那么,外部查询如何只返回Sales.SalesOrderDetail 的一部分,而不是全部?
【问题讨论】:
-
因为子查询中的
WHERE条件。这称为相关子查询。 -
@GordonLinoff,需要
GROUP BY吗?没有它,它会给出相同的结果。
标签: sql sql-server where exists