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

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;

为什么这样写能解决问题?

  1. 合并工具表:用UNION ALL把两个公司的工具数据合并,并且排除Company2里和Company1重复的工具,保证每个ToolCode只对应一个效率值
  2. 明确的JOIN关联:每个JOIN都加了ON条件,彻底避免笛卡尔积,确保表之间的关联逻辑正确
  3. 精准匹配效率:通过sa.UDF_ToolCode = cte.ToolCode把每一行的工具码和对应的效率绑定,这样每一行都会返回自己对应的效率值,而不是固定值

如果你的场景是“优先用Company1的效率,没有的话用Company2的”,这个写法完全适用;如果是其他规则(比如两个公司都有就取某一个),可以调整CTE里的逻辑就行。

备注:内容来源于stack exchange,提问作者pestomania

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:47:57