【问题标题】:SELECT all orders with more than one item and check all items status选择所有包含一件以上商品的订单并检查所有商品状态
【发布时间】:2012-12-27 09:37:54
【问题描述】:

我有 2 张桌子:

订单:

Id   |  Status
-----+--------
 1   |      OK
 2   | WAITING
 3   | WAITING
 4   |      OK
 5   |      OK
 6   |      OK

还有 Order_details:

Id   |  Order_Id  |  Status
-----+------------+--------
 1   |         1  |      S1
 2   |         1  |      S1
 3   |         2  |      S1
 4   |         4  |      S2
 5   |         4  |      S2
 6   |         4  |      S3
 7   |         5  |      S1
 8   |         5  |      S1

我需要做的是选择所有具有多个 Order_detail 的订单,并且订单状态必须为“OK”,并且每个 order_detail 必须在(S1,S2)中具有状态

我做过这样的事情:

SELECT O.Id FROM Orders O 
            JOIN Order_details OD 
                ON O.Id=OD.Order_Id
WHERE O.Status='OK' AND OD.Status IN ('S1','S2')
GROUP BY O.Id
HAVING count(DISTINCT OD.Id)>1

但这会返回具有多个 Order_details 满足条件的所有订单。

我确定这部分没问题:

SELECT O.Id FROM Orders O 
            JOIN Order_details OD 
                ON O.Id=OD.Order_Id
WHERE O.Status='OK'
GROUP BY O.Id
HAVING count(DISTINCT OD.Id)>1

但我必须检查上述订单的每个 Order_detail 是否有状态 IN (S1, S2)。

因此,如果订单将有 2 个详细信息,其中一个的 status=S1 和第二个 S3,则应跳过此订单。

【问题讨论】:

    标签: sql tsql sql-server-2005


    【解决方案1】:
    SELECT O.Id 
    FROM Orders O 
    JOIN Order_details OD ON O.Id=OD.Order_Id
    WHERE O.Status='OK'
    GROUP BY O.Id
    HAVING count(DISTINCT OD.Id)>1
    AND SUM(CASE WHEN OD.Status NOT IN ('S1','S2') 
                 THEN 1 
                 ELSE 0 
            END) = 0
    

    【讨论】:

      【解决方案2】:
      select O.id
      from orders O inner join order_details OD
      on O.Id=OD.Order_Id and O.Status='OK' AND OD.Status IN ('S1','S2')
      GROUP BY O.Id
      HAVING count(DISTINCT OD.Id)>1
      

      【讨论】:

      • 这不会与我的问题中的第一个代码给出相同的结果吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2020-06-06
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      相关资源
      最近更新 更多