更新SQL临时表报ORDER BY子句无效错误的问题求助
问题原因与修复方案
报错根因
你遇到的是SQL Server的标准语法限制:
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified
派生表、子查询、CTE这类内部查询结构中,ORDER BY只有搭配TOP/OFFSET/FOR XML关键字时才允许使用,否则数据库会认为排序无业务意义直接拦截。
你代码中派生表里的ORDER BY完全冗余:你仅需要通过facility_id、year、month三个字段分组聚合后,和外层临时表做等值匹配更新,派生表的排序不会对UPDATE的匹配逻辑和最终结果产生任何影响,直接删除即可。
修复后代码
UPDATE #tmp_work_order_completion SET completion_date = t.otp FROM (SELECT t.facility_id, t.year, t.month, SUM(CASE WHEN m.completion_date <= m.due_date THEN 1 ELSE 0 END) as completed_on_time, COUNT(DISTINCT m.id) as total_count, -- 乘以1.0避免整数除法,可按需保留/删除 SUM(CASE WHEN m.completion_date <= m.due_date THEN 1 ELSE 0 END)*1.0/COUNT(DISTINCT m.id) as otp FROM #tmp_work_order_completion t JOIN #tmp_monthly_work_orders m ON t.facility_id = m.facility_id AND t.year = YEAR ( m.inserted_at) AND MONTH ( m.inserted_at) <= t.month GROUP BY t.facility_id, t.year, t.month ) as t WHERE #tmp_work_order_completion.facility_id = t.facility_id AND #tmp_work_order_completion.year = t.year AND #tmp_work_order_completion.month = t.month
其他注意事项
如果删除ORDER BY后仍有报错,优先检查两个常见问题:
- 语法误改:删除ORDER BY时误删了GROUP BY末尾的逗号、派生表的闭合括号等语法元素,原WHERE条件的逻辑完全正确,不需要调整
- 类型不匹配:你当前将数值类型的准时率
otp赋值给了命名为completion_date的日期类型字段,大概率存在字段名写错的问题,建议确认是否要更新的是临时表中的otp字段而非日期字段 - 整数除法:如果需要得到小数格式的准时率,需要先将分子转为小数类型再做除法,否则两个整数相除会默认按整数计算,出现3/5=0的不符合预期的结果
内容的提问来源于stack exchange,提问作者Seth Johnson
相关产品推荐
相关产品推荐

