主页 > 知识库 > SqlServer 2005 T-SQL Query 学习笔记(4)

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

热门标签:AI电销 网站排名优化 地方门户网站 铁路电话系统 呼叫中心市场需求 Linux服务器 百度竞价排名 服务外包
比如,我要建立一个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
您可能感兴趣的文章:
  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)
  • 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
  • SQL Server中的T-SQL的基本对象
  • SqlServer 2005 T-SQL Query 学习笔记(3)
  • SqlServer 2005 T-SQL Query 学习笔记(2)
  • SqlServer 2005 T-SQL Query 学习笔记(1)
  • SQLServer 2008 新增T-SQL 简写语法
  • SQL Server 数据库管理常用的SQL和T-SQL语句
  • SQL Server 数据库管理常用的SQL和T-SQL语句
  • SQL Server 数据库管理常用的SQL和T-SQL语句
  • T-sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法

标签:湖南 崇左 铜川 衡水 仙桃 湘潭 兰州 黄山

巨人网络通讯声明:本文标题《SqlServer 2005 T-SQL Query 学习笔记(4)》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266