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