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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:45:40