删除具有不同状态度的不需要的行

Remove unnecessary rows with different status degree

订单号 订单状态
560 0002
560 0016
560 0028
180 0002
180 0215
180 0485

所以订单状态数字代表不同的状态'比如0002表示订单对象被创建,0485表示订单已经完成等。我想要实现的是订单完成或取消,我不想要查看订单的任何其他状态,如对象创建。我有三个 table。我们称它们为 A、B 和 C。OrderNumber 来自 table A,OrderStatus 来自 table C。 table B 是我保留 OrderNo 和 OrderStat 的联合 table。

   select A.OrderNumber, C.OrderStatus 
   from(A inner join B on B.OrderNo = A.OrderNo 
   inner join C on C.OrderStatus = B.OrderStat)
   where A.OrderNumber in (this is where I need some help I think);```

您可以去CTE获取所有已完成的订单。现在,您可以在结果集中过滤这些订单,并仅显示已完成状态的已完成订单。

注意:根据问题内容,​​我只考虑了已完成的订单。您也可以通过添加已取消的订单状态将已取消的订单添加到 CTE。

;WITH CTE_CompletedCancelledOrders AS
(
SELECT OrderNumber, OrderStatus FROM B
WHERE B.OrderStatus = '0485' -- completedOrders
)
select A.OrderNumber, C.OrderStatus 
   from A inner join B on B.OrderNo = A.OrderNo 
   inner join C on C.OrderStatus = B.OrderStatus
WHERE NOT EXISTS (SELECT 1 FROM CTE_CompletedCancelledOrders 
WHERE OrderNumber = A.OrderNumber) -- only incomplete Orders 
UNION ALL
SELECT * FROM CTE_CompletedCancelledOrders -- completed Orders

最好的方法可能是 window 函数:

select o.*
from (select A.OrderNumber, C.OrderStatus,
            sum(case when C.OrderStatus in ('0485', . . . ) then 1 else 0 end) over (partition by A.OrderNumber) as completed_or_canceled 
     from A inner join
          B
          on B.OrderNo = A.OrderNo inner join
          C
          on C.OrderStatus = B.OrderStat
     ) o
where completed_or_canceled = 0 or
      OrderStatus in ('0485', . . . );

. . . 用于定义 completed/canceled 条件的状态。