如何在UNION ALL中添加ORDER BY排序?SQL语法错误求助
问题分析与解决
错误原因
- UNION ALL分支不能单独使用ORDER BY:SQL语法规定,
UNION/UNION ALL的每个查询分支不能单独添加ORDER BY(除非分支配合TOP/OFFSET FETCH等行数限制子句),排序操作必须针对合并后的整个结果集执行。 - 列数不匹配:第一个
SELECT返回2个字段,第二个SELECT返回3个字段,UNION ALL要求两边查询的字段数量、顺序和数据类型必须完全一致,这也是后续可能触发报错的隐患。
正确写法
写法1:子查询包裹后统一排序
先合并两个结果集,再对整体执行排序,同时修正列数不匹配问题:
SELECT * FROM ( SELECT '' [Code], -- 补充缺失的Code字段,与第二个查询列数对齐 CASE WHEN ISNULL(TradeName, RegisteredName) = '' THEN '' ELSE CONCAT(ISNULL(TradeName, RegisteredName), ' (', LocType, ')') END [Description], '' [Param1] FROM a.Table1 UNION ALL SELECT '' [Code], '' [Description], '' [Param1] ) AS CombinedResults ORDER BY [Description] ASC;
写法2:直接在UNION ALL末尾添加ORDER BY
若无需对分支单独处理,可直接在整个UNION ALL语句末尾添加排序逻辑,SQL会自动对合并后的结果排序:
SELECT '' [Code], CASE WHEN ISNULL(TradeName, RegisteredName) = '' THEN '' ELSE CONCAT(ISNULL(TradeName, RegisteredName), ' (', LocType, ')') END [Description], '' [Param1] FROM a.Table1 UNION ALL SELECT '' [Code], '' [Description], '' [Param1] ORDER BY [Description] ASC;
额外优化(可选)
如果需要让空行(第二个查询的结果)排在最后,可以调整排序规则:
SELECT * FROM ( SELECT '' [Code], CASE WHEN ISNULL(TradeName, RegisteredName) = '' THEN '' ELSE CONCAT(ISNULL(TradeName, RegisteredName), ' (', LocType, ')') END [Description], '' [Param1] FROM a.Table1 UNION ALL SELECT '' [Code], '' [Description], '' [Param1] ) AS CombinedResults ORDER BY CASE WHEN [Description] = '' THEN 1 ELSE 0 END ASC, -- 空值后置 [Description] ASC;
内容的提问来源于stack exchange,提问作者CoreTM
相关产品推荐
相关产品推荐

