如何从表中筛选未关联event_value=23的交易ID(trxn_id)
解决方法:筛选完全不含event_value=23的交易ID
我完全懂你的痛点——直接用select trxn_id from table where event_value<>23根本没法得到想要的结果,因为只要某个交易ID存在其他非23的记录,它还是会被错误选中,哪怕其中一条是23。你的遍历方法虽然能凑合用,但效率实在不高,尤其是数据量大的时候。给你几个更高效的SQL方案:
方法1:GROUP BY + HAVING(直观易读,推荐)
这个方法通过分组统计每个交易ID下event_value=23的出现次数,只保留次数为0的ID:
SELECT trxn_id FROM your_table GROUP BY trxn_id HAVING SUM(CASE WHEN event_value = 23 THEN 1 ELSE 0 END) = 0;
原理:CASE语句会给每个event_value=23的记录标记为1,其他为0,SUM后如果结果是0,说明这个交易ID下完全没有23的记录。
方法2:NOT EXISTS(性能优异,适合大表)
利用子查询检查当前交易ID是否存在event_value=23的记录,不存在则保留:
SELECT DISTINCT trxn_id FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.trxn_id = t1.trxn_id AND t2.event_value = 23 );
原理:NOT EXISTS会快速终止子查询(只要找到一条符合条件的记录就停止),搭配trxn_id的索引会非常高效。加DISTINCT是因为每个交易ID有多条记录,去重后得到唯一的ID列表。
方法3:NOT IN(简单但需注意NULL场景)
先找出所有包含event_value=23的交易ID,再排除这些ID:
SELECT DISTINCT trxn_id FROM your_table WHERE trxn_id NOT IN ( SELECT trxn_id FROM your_table WHERE event_value = 23 );
注意:如果event_value可能为NULL,这个方法会出问题(因为NULL和任何值比较都返回未知),此时优先用NOT EXISTS。
为什么不推荐你的遍历方法?
当数据量较大时,逐个遍历DISTINCT trxn_id并插入的方式会产生大量数据库请求,性能开销极大,而且代码复杂度更高,不如直接用上述SQL语句一次性解决。
内容的提问来源于stack exchange,提问作者आनंद
相关产品推荐
相关产品推荐

