当前位置: 代码迷 >> Sql Server >> 如次SELECT详解,没看懂,求分析
  详细解决方案

如次SELECT详解,没看懂,求分析

热度:54   发布时间:2016-04-24 10:12:36.0
如下SELECT详解,没看懂,求分析
实例源自《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 
一个是里面的嵌套而已。
  相关解决方案