Oracle中筛选无历史记录ID数据的SQL查询问题
解决Oracle中筛选无历史记录数据的问题
需要从data_set表中筛选出无历史记录的ID对应的记录,排除存在历史记录的ID(如37798411、74368539)。你原有的SQL仅通过记录数判断,逻辑存在局限,以下是两种可行的修正方案:
方案一:精准排除存在历史记录的ID
基于业务中“有历史记录即存在end_date非空的记录”的定义,直接排除这类ID:
SELECT * FROM data_set ds WHERE NOT EXISTS ( SELECT 1 FROM data_set ds_hist WHERE ds_hist.id = ds.id AND ds_hist.end_date IS NOT NULL )
该查询会过滤掉所有存在历史版本的ID,仅保留没有任何历史记录的ID对应的所有记录。
方案二:结合记录数与当前有效状态筛选
如果确认无历史记录的ID仅存在一条当前有效记录(end_date为空),可以在原SQL基础上增加状态过滤:
SELECT * FROM data_set WHERE id IN ( SELECT id FROM data_set GROUP BY id HAVING COUNT(*) = 1 ) AND end_date IS NULL
此方案既保证ID只有一条记录,又确保该记录是当前有效状态,避免误选仅存历史记录的ID。
两种方案均能从你提供的输入数据中得到期望输出:
ID Start_date End_date ------------------------------------------------------------ 83851566 2023-09-21 00:00:00.000 83849576 2023-09-21 00:00:00.000 84042557 2023-09-21 00:00:00.000
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

