首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据其他行的值删除单个数据库表中的行

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

Stack Overflow用户
提问于 2014-12-30 14:25:22
回答 4查看 64关注 0票数 1

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

我有下表(和值):

代码语言:javascript
运行
复制
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')
;

N.B -

  • 请忽略字段上的数据类型。
  • 最后一个表可能有数千个条目要处理。
  • 如果需要,可以将上述内容直接粘贴到SQL (PostgreSQL 9.3.1)

我的要求是:

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

代码语言:javascript
运行
复制
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')

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

删除同一表和限制子句上的联接

但是,在合并上述需求时,我无法让它工作。

由于这将在一天结束时运行,我有一些想法,例如更改所有的条目的有效日期,将状态设置为过期。然后,只需删除所有这些命令,但仍会遇到GTD/GTC订单的状态问题。我不确定这是否也会比在同一逻辑下处理这一切更快。

对于如何解决这个问题,任何帮助(或新想法)都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-30 14:43:12

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2014-12-30 14:30:53

你的PostgreSQL版本是什么?

不管怎样,这就是我想出来的

代码语言:javascript
运行
复制
delete from TABLE1 where
STATUS in ('FILLED','EXPIRED','REJECTED','CANCELLED') or
STATUS in (select STATUS from TABLE1 where STATUS in ('PARTIAL','NEW')
           and VALIDITY!='DAY') OR
STATUS in (select status from TABLE1 where STATUS ='REPLACED'
           and orig_ID not in 
           (select ORig_ID from table1 where status in ('PARTIAL','NEW')))

http://sqlfiddle.com/#!15/9e465/54

票数 0
EN

Stack Overflow用户

发布于 2014-12-30 14:40:46

除非我弄错了,否则OP中的输出有错误,或者逻辑上有错误。

代码语言:javascript
运行
复制
DELETE 
FROM TABLE1 AS T
WHERE STATUS IN ('FILLED', 'EXPIRED', 'REJECTED', 'CANCELLED')
  OR ( STATUS IN ('PARTIAL', 'NEW')
      AND VALIDITY NOT IN ('GTD', 'GTC') )
  OR ( STATUS = 'REPLACED'
  AND NOT EXISTS
    (SELECT 1
     FROM TABLE1 tbl1
     WHERE T.ID <> tbl1.ID
       AND T.ORIG_ID = tbl1.ORIG_ID
       AND tbl1.STATUS IN ('PARTIAL', 'NEW')
       AND tbl1.VALIDITY NOT IN ('GTD', 'GTC')
    ) 
  );

http://sqlfiddle.com/#!15/9e465/16

编辑:看来OP意味着

“替换--除非它没有GTD/GTC状态,并且有其他具有相同ORIG_ID的条目”

而不是

替换--除非有其他具有相同ORIG_ID状态的条目没有GTD/GTC状态

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27707153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档