实例源自《Microsoft SQL Server 2008技术内幕:T-SQL查询》第三章 第74页
/*
如下表结构
Customers: custid,[……]
Employees: empid,[……]
Orders: orderid,custid,empid,[……]
查询:每个来自USA的雇员已经至少为其处理过1个订单的所有客户
如USA的雇员有(e1、e2、e3)
则:雇员e1为客户c处理过订单
雇员e2为客户c处理过订单
雇员e3为客户c处理过订单
求满足以上条件的客户c组成的集合
*/
SELECT *
FROM Sales.Customers AS C
WHERE NOT EXISTS ( SELECT *
FROM HR.Employees AS E
WHERE country = N'USA'
AND NOT EXISTS ( SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.empid = E.empid ) )
--逻辑思维不强,没看太明白,以上SQL求分析
--另有如下SQL,这个好理解,实现的是同样的功能
WITH TheseEmployees
AS ( SELECT empid
FROM HR.Employees
WHERE country = 'USA'
),
CharacteristicFunctions
AS ( SELECT custid ,
CASE WHEN custid IN ( SELECT custid
FROM Sales.Orders AS O
WHERE O.empid = E.empid )
THEN 1
ELSE 0
END AS charfun
FROM Sales.Customers AS C
CROSS JOIN TheseEmployees AS E
)
SELECT custid
FROM CharacteristicFunctions
GROUP BY custid
HAVING MIN(charfun) = 1
ORDER BY custid;
------解决方案--------------------
每个USA雇员都要处理过他的定单,反过来就是说只要有一个USA雇员没有处理过,就不要显示出来,两个not exists就这个意思。
------解决方案--------------------
NOT EXISTS就是不存在 只要不存在就不SELECT
一个是里面的嵌套而已。