生成连续ID记录行
目录
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