[英]Exclude records from table
我有一个父表和子表,其中父参考号在子表中有多个条目,状态为待定、成功和拒绝。 我需要一个查询,它将给我一个 output 的唯一参考号,其状态为成功和拒绝。 即使子表中的参考号有一个未决状态,也不应列出参考号。
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');
我现在尝试使用下面的查询并实现所需的 output。output 应该只返回 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));
如果您只想要 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'
如果您要在结果中包含日期或其他数据,则需要将上述内容作为子查询,然后将其连接回另一个表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.