【问题标题】:Exclude records from table从表中排除记录
【发布时间】:2022-12-11 12:32:15
【问题描述】:

我有一个父表和子表,其中父参考号在子表中有多个条目,状态为待定、成功和拒绝。我需要一个查询,它只会给我一个状态为成功和拒绝的参考编号的输出。即使子表中的参考号有一个未决状态,也不应列出参考号。

CREATE TABLE SI_DETAIL
  ( "S_NO" VARCHAR2(20 BYTE),
    "CREATED_DATE" DATE);
    
    
CREATE TABLE SI_TRANSDETAIL
  ( "S_NO"  VARCHAR2(20 BYTE),
    "SL_NO" VARCHAR2(20 BYTE),
    "EXE_DATE" DATE,
    "STATUS" VARCHAR2(20 BYTE));
    
    
Insert into SI_DETAIL (S_NO,CREATED_DATE) values ('1000',to_date('29-11-22','DD-MM-RR'));
Insert into SI_DETAIL (S_NO,CREATED_DATE) values ('1001',to_date('01-12-22','DD-MM-RR'));
Insert into SI_DETAIL (S_NO,CREATED_DATE) values ('1002',to_date('30-11-22','DD-MM-RR'));

    
    
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1000','1',to_date('30-11-22','DD-MM-RR'),'REJECTED');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1000','2',to_date('01-12-22','DD-MM-RR'),'SUCCESS');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1000','3',to_date('02-12-22','DD-MM-RR'),'SUCCESS');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1001','1',to_date('02-12-22','DD-MM-RR'),'SUCCESS');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1001','2',to_date('03-12-22','DD-MM-RR'),'PENDING');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1001','3',to_date('04-12-22','DD-MM-RR'),'PENDING');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1001','4',to_date('05-12-22','DD-MM-RR'),'PENDING');
Insert into SI_TRANSDETAIL (S_NO,SL_NO,EXE_DATE,STATUS) values ('1002','1',to_date('04-12-22','DD-MM-RR'),'PENDING');

我现在尝试使用以下查询并获得所需的输出。输出应该只返回 1000,因为它没有待处理的子记录。 有没有更好的解决办法

SELECT S_NO FROM SI_TRANSDETAIL DTL
WHERE  EXISTS (SELECT S_NO FROM SI_DETAIL HD
               WHERE  DTL.S_NO = HD.S_NO  
                      AND CREATED_DATE < SYSDATE - 1
                      AND HD.S_NO NOT IN (SELECT S_NO 
                                          FROM   SI_TRANSDETAIL SUB 
                                          WHERE  STATUS = 'PENDING' 
                                                 AND SUB.S_NO = HD.S_NO));

【问题讨论】:

  • 请将您的示例数据作为问题中的文本共享,而不是链接图像。
  • 您是说 C.status <>'Pending' 吗,从查询中您似乎提到了 c.status<>'P' 或者您可以使用 NOT LIKE 'P%'

标签: sql oracle where-clause exists


【解决方案1】:

如果你只想要 S_NO 而没有别的,我会使用 minus。它的工作方式类似于 union,因为这两个查询必须具有相同的列数和匹配的列类型。

select s_no
from si_detail
where created_date < sysdate - 1
minus
select s_no 
from si_transdetail
where status = 'PENDING'

如果您要在结果中包含日期或其他数据,则需要将上述内容作为子查询,然后将其连接回另一个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2016-04-08
    • 2020-07-06
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多