You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从表中筛选未关联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,提问作者आनंद

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:40