在Toad Oracle中按指定逻辑过滤customer表记录求助
Oracle customer表记录筛选方案
针对你需要的过滤逻辑——同一ID+ORDERID组合同时存在CODE='TT'和CODE='TP'时,仅保留TP记录,以下提供两种可行的SQL写法,均无需GROUP BY且能保留表中所有列:
方法一:使用EXISTS子查询(直观易懂)
直接排除掉那些属于TT且同组存在TP的记录,其余记录全部保留:
SELECT * FROM customer WHERE NOT ( CODE = 'TT' AND EXISTS ( SELECT 1 FROM customer c2 WHERE c2.ID = customer.ID AND c2.ORDERID = customer.ORDERID AND c2.CODE = 'TP' ) );
方法二:使用窗口函数(灵活扩展)
通过窗口函数标记每个分组的状态,再根据状态筛选:
SELECT * FROM ( SELECT *, -- 统计当前ID+ORDERID组内,属于TT/TP的记录总数 COUNT(CASE WHEN CODE IN ('TT', 'TP') THEN 1 END) OVER (PARTITION BY ID, ORDERID) AS code_pair_count, -- 标记当前记录是否为TP CASE WHEN CODE = 'TP' THEN 1 ELSE 0 END AS is_tp_record FROM customer ) filtered WHERE (code_pair_count = 1) OR (code_pair_count = 2 AND is_tp_record = 1);
逻辑说明:
- 当
code_pair_count=1:说明该组只有TT或只有TP,直接保留; - 当
code_pair_count=2:说明组内同时有TT和TP,仅保留标记为is_tp_record=1的记录。
内容的提问来源于stack exchange,提问作者Sam Sid
相关产品推荐
相关产品推荐

