分享小知識:善用Group By排序

如下列舉了公用表/臨時表/聚合函數三個因素爲例子(覆蓋索引因素除外,有利用此類索引都會以索引順序)html

 環境:
Microsoft SQL Server 2014 (SP1-GDR) (KB3194720) - 12.0.4232.0 (X64) 
	Sep 23 2016 18:45:14 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 10240: )

  

--公用表表達式
--一、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID2,ID FROM CTE GROUP BY ID,ID2;

--二、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID,ID2;

--三、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2 FROM CTE GROUP BY ID2,ID;

--四、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID2,ID;

  

--臨時表
IF OBJECT_ID('Tempdb..#CTE') IS NOT NULL
	DROP TABLE #CTE;
SELECT 1 AS ID,2 AS ID2 INTO #CTE
UNION ALL
SELECT 2 AS ID,1 AS ID2
--五、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID,ID2;
--六、
SELECT ID,ID2 FROM #CTE GROUP BY ID,ID2;
--七、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID2,ID;
--八、
SELECT ID,ID2 FROM #CTE GROUP BY ID2,ID;

顯示效果:
sql

結論:表按分組列(group by 後)順序沒聚合函數時 從左到右,非則反之。特殊狀況CTE時按存儲顯示列(SELECT)順序從左到右
這一部分的列存儲順序函數

;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
相關文章
相關標籤/搜索