生成连续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