源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

SqlServer 2005 T-SQL Query 学习笔记(4)

  • 时间:2020-09-10 00:37 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:SqlServer 2005 T-SQL Query 学习笔记(4)
比如,我要建立一个1,000,000行的数字表: CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY); DECLARE @max AS INT, @rc AS INT; SET @max = 1000000; SET @rc = 1; INSERT INTO Nums VALUES(1); WHILE @rc * 2 <= @max BEGIN INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums; SET @rc = @rc * 2; END INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max; 这种方式非常巧妙,它并不是一个一个的循环插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。 为什么这样会快呢? 是因为它节省了跟比较其他可用解决方案进行比较和记录这些日志的时间。 然后,作者给了一个CTE的递归的解决方案: DECLARE @n AS BIGINT; SET @n = 1000000; WITH Nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM Nums WHERE n < @n ) SELECT n FROM Nums OPTION(MAXRECURSION 0);--为了移除默认100的递归限制 有个更优的CTE的解决方案,就是先生成很多行,然后用ROW_NUMBER进行计算,再选择ROW_NUMBER这列的值就可以了。
[u]复制代码[/u] 代码如下:
DECLARE @n AS BIGINT; SET @n = 1000000; WITH Base AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM Base WHERE n < CEILING(SQRT(@n)) ), Expand AS ( SELECT 1 AS c FROM Base AS B1, Base AS B2 ), Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM Expand ) SELECT n FROM Nums WHERE n <= @n OPTION(MAXRECURSION 0);
利用笛卡尔积进行不断的累加,达到了22n行。 最后,作者给出了一个函数,用于生成这样的数字表:
[u]复制代码[/u] 代码如下:
CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE AS RETURN WITH L0 AS(SELECT 1 AS c UNION ALL SELECT 1), L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B), L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B), L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B), L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B), L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B), Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5) SELECT n FROM Nums WHERE n <= @n; GO
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部