SQL Server中如何正确合并多个SQL标量查询的结果?
SQL Server 合并多个单行单列标量查询结果的方法
针对将多个返回单值的查询结果合并到同一个结果集的需求,在SQL Server下有几种常用实现,可根据业务场景选择:
按列合并(你提到的更优方案)
你当前的写法可以正常运行,但存在冗余问题:外层的FROM [table]完全不需要,一旦这张表是空表,整个查询会直接返回空结果,不会返回Res1、Res2的结构。
去掉外层表依赖的最简写法如下,不需要依赖任何基表就能正常返回结果,没有匹配数据时对应列会返回NULL:
SELECT (SELECT TOP 1 [col1] FROM [table] WHERE con1 = 1 ORDER BY [col1] DESC) AS Res1, (SELECT TOP 1 [col1] FROM [table] WHERE con2 = 1 ORDER BY [col1] DESC) AS Res2
如果所有子查询都是查同一张表,还可以用条件聚合优化性能,只需要扫一次表就能拿到所有结果,数据量大时比多次子查询效率高很多:
SELECT MAX(CASE WHEN con1 = 1 THEN [col1] END) AS Res1, MAX(CASE WHEN con2 = 1 THEN [col1] END) AS Res2 FROM [table]
说明:因为需求是取符合条件的col1降序第一行,也就是分组下的最大值,用MAX聚合刚好匹配需求,如果是取升序第一行换成MIN即可。
按行合并
如果不需要横向列对齐,也可以按行返回结果,用UNION ALL拼接每个查询即可,注意每个带ORDER BY的TOP查询需要包成子查询,避免语法报错:
SELECT ResultName, ResultValue FROM ( SELECT TOP 1 'Res1' AS ResultName, [col1] AS ResultValue FROM [table] WHERE con1 = 1 ORDER BY [col1] DESC ) t1 UNION ALL SELECT ResultName, ResultValue FROM ( SELECT TOP 1 'Res2' AS ResultName, [col1] AS ResultValue FROM [table] WHERE con2 = 1 ORDER BY [col1] DESC ) t2
这种写法扩展很方便,后续要加新的查询结果,直接新增一个UNION ALL分支就行,不需要修改已有列结构。
单字符串拼接
如果只需要拿到合并后的文本结果,直接用CONCAT拼接所有标量结果即可:
SELECT CONCAT( 'Res1:', (SELECT TOP 1 [col1] FROM [table] WHERE con1 = 1 ORDER BY [col1] DESC), ' | Res2:', (SELECT TOP 1 [col1] FROM [table] WHERE con2 = 1 ORDER BY [col1] DESC) ) AS MergedResult
提示:SQL Server中判断bit类型字段不要写
= true,T-SQL没有布尔值的字面量写法,bit类型字段直接写= 1(真)或= 0(假)即可。
内容的提问来源于stack exchange,提问作者user17611369
相关产品推荐
相关产品推荐

