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

CASE语句返回重复值,请求修正SQL以获取正确的cc、x、y值

修正你的CASE语句问题

首先看你提供的SQL,问题出在子查询的CASE逻辑和WHERE条件上,导致Y和z返回相同值,具体原因如下:

  1. CASE表达式逻辑无效:你的两个CASE语句里,THEN和ELSE都返回td.td_code,不管条件是否满足,结果自然完全一样;
  2. WHERE条件限制过严:子查询里的td.tab_id = 30478直接过滤掉了tab_id=30477的记录,第一个CASE的条件永远不会触发,Y和z只能是30478对应的td_code。

假设你的需求是获取同一个td_id对应的tab_id=30477的td_code作为Y,tab_id=30478的td_code作为z,下面给你两种修正方案:

方案一:使用条件聚合(推荐)

这种方法适合每个td_id对应每个tab_id只有一条记录的场景,通过分组聚合来获取两个值:

SELECT cc.x, sfc.y, sfc.z 
FROM t1 cc, t2 ccd 
JOIN (
  SELECT 
    td.td_id,
    -- 只在tab_id=30477时取td_code,否则返回NULL,用MAX聚合获取有效值
    MAX(CASE WHEN td.tab_id = 30477 THEN td.td_code END) AS Y,
    MAX(CASE WHEN td.tab_id = 30478 THEN td.td_code END) AS z
  FROM t3 td
  JOIN t4 td_nls ON td_nls.td_id = td.td_id
  WHERE td.tab_id IN (30477, 30478) -- 筛选需要的两个tab_id
  GROUP BY td.td_id -- 按td_id分组,确保每个id只返回一行
) SFC ON cc.td_id = SFC.td_id -- 这里需要根据实际表结构补充正确的连接条件
-- 补充cc和ccd的连接条件,比如 AND cc.xxx = ccd.xxx
WHERE cc.commodit... -- 你的原有WHERE条件

方案二:使用自连接

如果每个td_id同时存在30477和30478两种tab_id的记录,也可以用自连接的方式:

SELECT cc.x, sfc.y, sfc.z 
FROM t1 cc, t2 ccd 
JOIN (
  SELECT 
    td1.td_id,
    td1.td_code AS Y,
    td2.td_code AS z
  FROM t3 td1
  JOIN t3 td2 ON td1.td_id = td2.td_id -- 自连接获取同一个td_id的两条记录
  JOIN t4 td_nls1 ON td_nls1.td_id = td1.td_id
  JOIN t4 td_nls2 ON td_nls2.td_id = td2.td_id
  WHERE td1.tab_id = 30477 
    AND td2.tab_id = 30478
) SFC ON cc.td_id = SFC.td_id -- 补充正确的连接条件
-- 补充cc和ccd的连接条件
WHERE cc.commodit... -- 你的原有WHERE条件

注意:你主查询里的cc和ccd的连接条件没写完,记得补充完整,否则会产生笛卡尔积哦。

内容的提问来源于stack exchange,提问作者Archana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:32