在某个活动发生后,删除一个ID的所有条目的SQL语句是什么?[已关闭]

问题描述 投票:-1回答:2

我正在努力使用Vertica SQL语句,以便在某个事件发生后删除一个OrderID的所有条目。

这是我的数据的一个表示。

**OrderID     Activity**  
1             Item Started  
1             Task 1 complete  
1             In storage  
1             Deletion   
1             Deletion Complete  
2             Item Started  
2             Deletion  
2             Deletion Complete  

在这种情况下,我想删除订单ID 1的条目 "删除 "和 "删除完成",因为它们发生在活动 "入库 "之后。我想保留订单ID 1的所有条目,直到(并包括)"入库"。

对于订单ID 2,情况并非如此,因此我想保留它。

sql vertica
2个回答
1
投票

如果您的情况与您所描述的完全相同--而且您确实没有相关的时间戳,无法检查之前和之后发生的事情--那么您可以删除所有活动为 "删除 "或 "删除完成 "的记录,并且其订单id等于活动为 "入库 "的任何记录的订单id。

但是,如果 "入库 "需要发生在 "删除 "或 "删除完成 "之前,那么你还需要在我下面使用的子选择中进行验证。

-- create the example table - drop any table of that name existing before ...
DROP TABLE IF EXISTS input;
CREATE TABLE input(OrderID,Activity) AS (
          SELECT 1,'Item Started'
UNION ALL SELECT 1,'Task 1 complete'
UNION ALL SELECT 1,'In storage'
UNION ALL SELECT 1,'Deletion'
UNION ALL SELECT 1,'Deletion Complete'
UNION ALL SELECT 2,'Item Started'
UNION ALL SELECT 2,'Deletion'
UNION ALL SELECT 2,'Deletion Complete'
);
-- here goes 
DELETE
FROM  input
WHERE orderid IN (
  SELECT orderid FROM input WHERE activity='In storage'
)
  AND activity IN('Deletion','Deletion Complete')
;


0
投票

你可以分两步进行删除 1.删除所有 "入库 "不可用的记录。

 DELETE FROM table t1 WHERE 
 not exists ( select 1 from table t2 where t1.id=t2.id
                                 and Activity in ('In storage')
 )

第二步,其中 "存储 "可用

DELETE FROM table t1 where activity in('Deletion','Deletion Complete')
© www.soinside.com 2019 - 2024. All rights reserved.