Union合并列后用Case判断来源的SQL查询问题求助
问题分析与解决
你的原查询存在两个核心问题:
- 笛卡尔积导致数据重复/爆炸:用逗号连接子查询
u和table1却未加关联条件,会让u的每一行都和table1的所有行匹配,结果行数是两者的乘积,完全不符合预期。 - 判断逻辑错误:
case when u.organism_id IN cpl.column1的写法不成立,IN后需要值集合,而这里cpl.column1是单一行的列值,再加上笛卡尔积的影响,最终is_column1的结果会完全混乱。
正确写法
不需要事后关联表判断来源,直接在拆分列时就生成标识字段即可:
1. 保留所有原始记录(包含重复值)
如果column1和column2中有相同值,且需要保留每一条来源记录,用UNION ALL:
SELECT column1 AS organism_id, 1 AS is_column1 FROM table1 UNION ALL SELECT column2 AS organism_id, 0 AS is_column1 FROM table1
- 第一个子查询提取
column1,标记is_column1=1 - 第二个子查询提取
column2,标记is_column1=0 UNION ALL会保留所有行,包括重复值
2. 去重后统一标识
如果需要合并重复的organism_id,且只要该值在column1出现过就标记为1,否则标记为0:
SELECT organism_id, MAX(is_column1) AS is_column1 FROM ( SELECT column1 AS organism_id, 1 AS is_column1 FROM table1 UNION ALL SELECT column2 AS organism_id, 0 AS is_column1 FROM table1 ) t GROUP BY organism_id
- 子查询先拆分所有值并标记来源
- 外层用
GROUP BY去重,MAX(is_column1)确保只要值在column1出现过,最终标记就是1
内容的提问来源于stack exchange,提问作者mdelas
相关产品推荐
相关产品推荐

