ID值記錄行,即每一個數字一行的集合,有些時候在SQL中可以作為輔助表使用,從而用SQL的集合思維去高效解決問題,而不是用循環。
用自定義函數(UDF)來實現就不說了,無非是在裡面寫一個循環,住表變量裡插數據,再返回那個表變量。
下面介紹幾種不用UDF實現的方法。
小範圍的數字記錄
可以巧用系統表來獲取1到2048之間的數字:
SELECT number FROM master..spt_values
WHERE Type = 'P' AND number BETWEEN 1 AND 1024
特定的枚舉值
比如返回1,7,9,10這樣沒有規律的集合,而且量不大,便於直接枚舉。
可以通過從MSSQL 2008開始的表值構造函數(Table Value Constructor)去實現:
SELECT T.Num
FROM (VALUES (1),(7),(9),(10)) AS T(Num)
當然用這個特性還可以構建其他多列不同類型值的集合,比如返回a,b,c,d這樣的集合。
用公用表達式(CTE)遞歸查詢產生大量連續數據行(性能不佳)
利用遞歸查詢的簡潔寫法去實現:
WITH cte(Num) AS
(
SELECT 1
UNION ALL
SELECT Num + 1 FROM cte WHERE Num <= 99
)
SELECT * FROM cte
如果是Oracle,除了CTE外,還可以用它專有的更為簡潔的遞歸語法:
SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 50