CASE语句返回重复值,请求修正SQL以获取正确的cc、x、y值
修正你的CASE语句问题
首先看你提供的SQL,问题出在子查询的CASE逻辑和WHERE条件上,导致Y和z返回相同值,具体原因如下:
- CASE表达式逻辑无效:你的两个CASE语句里,
THEN和ELSE都返回td.td_code,不管条件是否满足,结果自然完全一样; - 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
相关产品推荐
相关产品推荐

