【发布时间】:2021-04-04 03:55:41
【问题描述】:
我有两个表,BATCH_MESSAGES,BATCH_INSTRUCTIONS,如果其中任何指令的状态为暂停/拒绝,我想排除所有批次。
这里左边是 BATCH_MESSAGES,右边是 BATCH_INSTRUCTIONS。
这是针对:BATCH_INSTRUCTIONS
仅应输出“CDC-SCBP-862411139626”,因为它是唯一一个所有指令状态为 NOT IN 暂停/拒绝。
我的查询产生相同的结果但它使用子查询复杂且效率低下。有没有更好的方法?
SELECT DISTINCT BM.ID,
BM.BATCH_MSG_TYPE,
BM.PARENT_BATCH_ID
FROM iris_activity.BATCH_MESSAGES BM
WHERE BM.INSTRUCTIONS_COUNT = BM.PROCESSED_INSTRUCTIONS
AND BM.STAGE NOT IN ('COMPLETED')
AND BM.BATCH_MSG_TYPE NOT LIKE 'pacs.004%'
AND BM.RECEIVING_MODE = 'Stream'
AND BM.ID NOT IN (SELECT DISTINCT BATCH_ID
FROM iris_activity.BATCH_MESSAGES bm
INNER JOIN Iris_activity.BATCH_INSTRUCTIONS bi
on (bm.id = bi.BATCH_ID
and bm.BATCH_MSG_TYPE = bi.BATCH_TYPE)
WHERE STATUS IN ('Suspended','Rejected')
GROUP BY BATCH_ID, STATUS)
AND BM.RETRIES <=5 ;
这样可以更高效、更简单吗?
【问题讨论】:
-
请包含 DDL(您只共享了几行中的几个列值)。这些表中有多少行?您的查询实际需要多长时间?请分享执行计划,以便我们了解您正在处理的内容。
id是batch_messages的主键吗?有人会期望如此,但您已将distinct添加到查询中,这表明会有相同id的行。使用子查询不会使查询效率低下。在子查询中使用group by batch_id, status和distinct batch_id是多余的,not in无论如何都会隐式删除重复数据。
标签: sql oracle performance subquery query-optimization