SQL查询中CASE语句返回固定效率值0.85而非对应行实际值的问题求助
SQL查询中CASE语句返回固定效率值0.85而非对应行实际值的问题求助
嘿,我来帮你捋捋这个问题~首先得说,你遇到的所有行返回同一个效率值的问题,根源出在原查询的CASE子句逻辑错误,还有表关联的写法上,咱们一步步拆解:
原查询的核心问题
你原CASE语句里的ELSE部分是这么写的:
ELSE (SELECT TOP (1) UDF_EFFICIENCY FROM Company2.dbo.JT_ToolCode)
这里根本没有关联当前行的Step_Atts.UDF_ToolCode!也就是说不管当前行的工具码是什么,都会返回Company2工具表的第一条数据的效率值(也就是你看到的0.85),这就导致所有行都显示同一个数。
另外,原查询的FROM子句用逗号直接连接三个表,没有任何关联条件,会产生笛卡尔积(所有表的行两两组合),结果完全不符合预期,甚至可能拖慢查询。
你修改后的CTE思路是对的,但JOIN逻辑太混乱
你用CTE合并两个公司工具表的想法没问题,但后面的JOIN写法有几个致命问题:
- 多个INNER JOIN连在一起却没写ON条件,SQL语法上这是错误的,会导致意外的笛卡尔积
- 重复关联了
Step_Atts表(既有原名又有sa别名),还多余JOIN了Company2的工具表,逻辑冗余且冲突 - WHERE里的
Step_Atts.UDF_ToolCode = COMPANY2.dbo.JT_ToolCode.ToolCode会强制只匹配Company2的工具,完全违背了你想匹配两个公司工具的初衷
给你整理的正确写法
咱们先把两个公司的工具效率合并成一个统一的数据集,再和主表正确关联:
-- 先合并两个公司的工具效率,优先取Company1的,再补Company2独有的 WITH CombinedToolEfficiency AS ( SELECT ToolCode, UDF_EFFICIENCY FROM Company1.dbo.JT_ToolCode UNION ALL SELECT ToolCode, UDF_EFFICIENCY FROM Company2.dbo.JT_ToolCode WHERE ToolCode NOT IN (SELECT ToolCode FROM Company1.dbo.JT_ToolCode) ) SELECT sa.UDF_ToolCode, cte.UDF_EFFICIENCY AS Efficiency, input.UDF_DATE, input.UDF_QUANTITY, input.UDF_PROGRAM, sched.UDF_SEQUENCE, sched.UDF_STEP, sched.UDF_STEP_DURATION, sched.UDF_DAYS_FROM_START, input.UDF_DATE - sched.UDF_DAYS_FROM_START AS "Activity Date", sa.UDF_CYCLEHOURS, sched.UDF_LOCATION, sched.UDF_CYCLE FROM Company1.dbo.JT_UDT_CAP_MOD_INPUT input -- 正确关联输入表和计划表 INNER JOIN Company1.dbo.JT_UDT_CAP_MOD_PROGRAM_SCHED sched ON input.UDF_PROGRAM = sched.UDF_PROGRAM -- 正确关联计划表和步骤属性表 INNER JOIN Company1.dbo.JT_UDT_CAP_MOD_STEP_ATT sa ON sched.UDF_STEP = sa.UDF_STEP AND sa.UDF_PROGRAM = input.UDF_PROGRAM -- 关联到合并后的工具效率表,匹配当前行的工具码 INNER JOIN CombinedToolEfficiency cte ON sa.UDF_ToolCode = cte.ToolCode ORDER BY input.UDF_DATE, input.UDF_PROGRAM, sched.UDF_SEQUENCE;
为什么这样写能解决问题?
- 合并工具表:用
UNION ALL把两个公司的工具数据合并,并且排除Company2里和Company1重复的工具,保证每个ToolCode只对应一个效率值 - 明确的JOIN关联:每个JOIN都加了ON条件,彻底避免笛卡尔积,确保表之间的关联逻辑正确
- 精准匹配效率:通过
sa.UDF_ToolCode = cte.ToolCode把每一行的工具码和对应的效率绑定,这样每一行都会返回自己对应的效率值,而不是固定值
如果你的场景是“优先用Company1的效率,没有的话用Company2的”,这个写法完全适用;如果是其他规则(比如两个公司都有就取某一个),可以调整CTE里的逻辑就行。
备注:内容来源于stack exchange,提问作者pestomania
相关产品推荐
相关产品推荐

