SQL Server 2008中推出了GROUPING SETS()
这似乎正是你所追求的。由他人提出的解决方案UNION现在可以轻松地与一个单一的选择来替换GROUPING SETS
。
基本上,您使用的是这样的:
SELECT A, B, C
FROM …
WHERE …
GROUP BY GROUPING SETS ((A), (B), (C))
这相当于
SELECT A, NULL, NULL, …
FROM …
WHERE …
GROUP BY A
UNION ALL
SELECT NULL, B, NULL, …
FROM …
WHERE …
GROUP BY B
UNION ALL
SELECT NULL, NULL, C, …
FROM …
WHERE …
GROUP BY C
所以,您的查询可能是这样的:
SELECT X, Y, COUNT(*)
FROM your complex joins and filters
GROUP BY GROUPING SETS ((X), (Y))
或者这样:
SELECT
CASE WHEN X IS NULL THEN 'Y' ELSE 'X' END AS ObjType
CASE WHEN X IS NULL THEN Y ELSE X END AS Obj,
COUNT(*)
FROM your complex joins and filters
GROUP BY GROUPING SETS ((X), (Y))
第二个假定X
不能为NULL。
参考文献:
不错..只是换名/定义:)谢谢 – ariel
@ariel不知道是否“减少昂贵通货膨胀”你指的是你的问题的代码或性能?作为性能优化,这种效应将是中性的。它将重用查询定义而不是工作。CTE仍会得到两次评估,该计划可能与您的原始查询相同。 –
是的,看到在执行计划 – ariel