SqlServer 2005 T-SQL Query 学习笔记(4)
导读:收集整理的这篇文章主要介绍了SqlServer 2005 T-SQL Query 学习笔记(4),觉得挺不错的,现在分享给大家,也给大家做个参考。 比如,我要建立一个1,000,000行...
收集整理的这篇文章主要介绍了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这列的值就可以了。
复制代码 代码如下:
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行。
最后,作者给出了一个函数,用于生成这样的数字表:
复制代码 代码如下:
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
您可能感兴趣的文章:
- SQL Server SQL高级查询语句小结
- SqlServer 2005 T-SQL Query 学习笔记(3)
- sqlserver查询去掉重复数据的实现
- SqlServer 表单查询问题及解决方法
- SQL Server 的T-SQL高级查询详解
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: SqlServer 2005 T-SQL Query 学习笔记(4)
本文地址: https://pptw.com/jishu/632061.html