如何排除所有曾关联store_id=0的valueid对应的全部记录
问题核心逻辑说明
你之前的写法仅能过滤单条store_id=0的记录,无法将只要关联过一次store_id=0的valueid对应的所有记录全部剔除,核心需要先识别所有关联过store_id=0的valueid,再全局排除这些valueid的所有行。
实现方案
方案1:NOT IN子查询(最易理解)
SELECT valueid, store_id FROM 你的表名 WHERE valueid NOT IN ( SELECT DISTINCT valueid FROM 你的表名 WHERE store_id = 0 );
子查询先查出所有关联过store_id=0的valueid,外层查询直接排除这些valueid即可得到预期结果。
方案2:LEFT JOIN关联排除(部分场景性能更优)
SELECT t1.valueid, t1.store_id FROM 你的表名 t1 LEFT JOIN ( SELECT DISTINCT valueid FROM 你的表名 WHERE store_id = 0 ) t2 ON t1.valueid = t2.valueid WHERE t2.valueid IS NULL;
通过左连接匹配关联过store_id=0的valueid,匹配不到的就是符合要求的记录。
方案3:窗口函数(支持窗口函数的SQL引擎适用)
SELECT valueid, store_id FROM ( SELECT valueid, store_id, MAX(CASE WHEN store_id = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY valueid) AS has_zero_tag FROM 你的表名 ) t WHERE has_zero_tag = 0;
给每个valueid打标签,只要该valueid下存在store_id=0的记录,标签就为1,过滤标签为0的即可。
内容的提问来源于stack exchange,提问作者Asamoa
相关产品推荐
相关产品推荐

