【问题标题】:SQL Select employees with at least 2 orders with at least one of which is in a certain district, without nested SQL blocksSQL 选择至少有 2 个订单的员工,其中至少有一个在某个地区,没有嵌套的 SQL 块
【发布时间】:2017-06-09 11:59:54
【问题描述】:

我有两个表,“客户”和“员工”,它们通过第三个表“订单”连接

| CustomerID | CDistrict |    | EmployeeID | EName |
|------------|-----------|    |------------|-------|
|      1     |     A     |    |      1     |  Alex |
|      2     |     A     |    |      2     |  Bob  |
|      3     |     B     |    |      3     |  Edd  |
|      4     |     C     |

| OrderID | CustomerID | EmployeeID |
|---------|------------|------------|
|    1    |      1     |      1     |
|    2    |      3     |      1     |
|    3    |      3     |      2     |
|    4    |      5     |      2     |
|    5    |      1     |      3     |

如何选择至少服务过 2 个订单的所有员工的姓名,其中至少是来自“A”区的客户没有嵌套 SQL 块?也就是说,结果应该是“亚历克斯”。

我设法通过嵌套查询来做到这一点,如下所示:

SELECT EName FROM Database.Employees
WHERE 
    EmployeeID IN 
    (SELECT EmployeeID FROM Database.Orders
        GROUP BY EmployeeID
        HAVING COUNT(*) >= 2)
AND
    EmployeeID IN
    (SELECT EmployeeID FROM Database.Orders
        WHERE 
            CustomerID IN
            (SELECT CustomerID FROM Database.Customers
                WHERE CDistrict = 'A'));    

但是,我需要在没有嵌套查询的情况下执行此操作。 我的查询选择至少服务过 2 个订单的所有员工如下所示:

SELECT EName FROM Database.Employees, Database.Orders
WHERE 
    Employees.EID = Orders.EID
    GROUP BY EName HAVING COUNT(OrderID) >=2
ORDER BY EName;  

我的查询从“A”区选择为客户提供服务的所有员工如下所示:

SELECT EName FROM Database.Employees, Database.Orders, Database.Customers
WHERE 
    Employees.EID = Orders.EID
    AND
    Orders.CID = Customers.CID
    AND
    CDistrict = 'A';    

但是,当我尝试将这些查询加入到单个查询中时,例如

SELECT EName FROM Database.Employee, Database.Orders, Database.Customers
WHERE 
    Employees.EID = Orders.EID
    AND
    Orders.CID = Customers.CID
    AND
    CDistrict = 'A'
    GROUP BY EName HAVING COUNT(OrderID) >=2;

我变成了 0 个结果。我想,这个查询可能会搜索在“A”区至少服务过 2 个订单的所有员工,但这不是我需要的 - 我需要至少服务过两个订单的员工,其中至少一个是在“A”区。我究竟做错了什么?如何将嵌套查询转换为常规查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用GROUP BYHAVING

    SELECT o.EmployeeID
    FROM Database.Orders o JOIN
         Database.Customers c
         ON o.CustomerId = c.CustomerId
    GROUP BY o.EmployeeID
    HAVING COUNT(*) >= 2 AND
           SUM(c.CDistrict = 'A') > 0;
    

    【讨论】:

    • 这几乎可以工作,但我需要员工的姓名,而不是 ID
    • @ZyTelevan 。 . .您应该能够重新加入Employees 表以获取名称(请记住将名称包含在GROUP BY 中)。
    【解决方案2】:
    SELECT E.EName 
    FROM Employees E INNER JOIN Orders O 
         ON O.EmployeeID=E.EmployeeID 
    INNER JOIN Customers C 
         ON C.CustomerID=O.CustomerID 
    WHERE C.CDistrict='A' 
    GROUP BY E.EmployeeID 
    HAVING COUNT(O.CustomerID) >= 2
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多