gpt4 book ai didi

sql - 根据其他行的值删除单个数据库表中的行

转载 作者:行者123 更新时间:2023-11-29 13:57:58 25 4
gpt4 key购买 nike

我有一个相当复杂的需求,我想在 Postgres 数据库中使用 SQL 来解决。我确信这会在任何订单管理系统中得到解决,但是我找不到任何类似性质的东西。

我有下表(和值):

CREATE TABLE TABLE1 (
ID varchar(8),
ORIG_ID varchar(8),
STATUS varchar(8),
VALIDITY varchar(8)
);

INSERT INTO TABLE1
(ID, ORIG_ID, STATUS, VALIDITY)
VALUES
('1', '1', 'REPLACED','DAY'),
('2', '1', 'REPLACED','DAY'),
('3', '1', 'FILLED','DAY'),
('4', '4', 'REJECTED','DAY'),
('5', '5', 'PARTIAL','GTC'),
('6', '6', 'EXPIRED','GTD'),
('7', '7', 'REPLACED','GTD'),
('8', '7', 'PARTIAL','GTD'),
('9', '9', 'FILLED', 'GTD'),
('10', '10', 'NEW', 'DAY'),
('11', '11', 'NEW', 'GTD'),
('12', '12', 'DFD', 'GTD'),
('13', '13', 'REPLACED', 'GTD'),
('14', '13', 'FILLED', 'GTD')
;

注意 -

  • 请忽略字段上的数据类型
  • 决赛 table 可能有数千个条目需要处理
  • 如果需要,可以将以上内容直接粘贴到 SQL Fiddle 中 (PostgreSQL 9.3.1)

我的要求是:

删除所有状态为以下之一的条目:

FILLED, EXPIRED, REJECTED, CANCELLED
PARTIAL/NEW - If the VALIDITY is not GTD/GTC (i.e. only DAY)
REPLACED - Unless there are other entries with the same ORIG_ID in a PARTIAL/NEW STATUS and not GTD/GTC (still working orders)

TBD - To Be Deleted:
TBD ('1', '1', 'REPLACED','DAY'),
TBD ('2', '1', 'REPLACED','DAY'),
TBD ('3', '1', 'FILLED','DAY'),
TBD ('4', '4', 'REJECTED','DAY'),
('5', '5', 'PARTIAL','GTC'),
TBD ('6', '6', 'EXPIRED','GTD'),
('7', '7', 'REPLACED','GTD'),
('8', '7', 'PARTIAL','GTD'),
TBD ('9', '9', 'FILLED', 'GTD'),
TBD ('10', '10', 'NEW', 'DAY'),
('11', '11', 'NEW', 'GTD'),
('12', '12', 'DFD', 'GTD'),
TBD ('13', '13', 'REPLACED', 'GTD'),
TBD ('14', '13', 'FILLED', 'GTD')

我试着找了一下,我能找到的壁橱如下:

Delete with join on the same table and limit clause

但是,在满足上述要求的同时,我无法让它工作。

因为这将在一天结束时运行,所以我有一些想法,例如更改所有条目的 VALIDITY of DAY,将 STATUS 设置为 EXPIRED。然后将它们全部删除,但仍然会遇到 GTD/GTC 订单的状态问题。我不确定这是否也比在相同逻辑下处理它更快。

任何有关如何解决此问题的帮助(或新想法)将不胜感激。

最佳答案

Delete from table1
WHERE status in ('FILLED','EXPIRED','REJECTED','CANCELLED')
OR (status in ('PARTIAL','NEW') AND validity not in ('GTD','GTC'))
OR (status = 'REPLACED' and orig_ID not in
(select ORig_ID from table1 where status in ('PARTIAL','NEW')));

http://sqlfiddle.com/#!15/9e465/28/0

关于sql - 根据其他行的值删除单个数据库表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com