加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 数据库 > MsSql > 正文

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

发布时间:2020-09-05 14:13:13 所属栏目:MsSql 来源:互联网
导读:作者他很喜欢建立数字辅助表(即是1-N的数字按顺序组成的表),关于如何建立这些辅助表,然后他给了一些例子,这些例子很有代表性。

比如,我要建立一个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这列的值就可以了。 <div class="codetitle"><a style="CURSOR: pointer" data="61198" class="copybut" id="copybut61198" onclick="doCopy('code61198')"> 代码如下:<div class="codebody" id="code61198">
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行。 最后,作者给出了一个函数,用于生成这样的数字表:
<div class="codetitle"><a style="CURSOR: pointer" data="52912" class="copybut" id="copybut52912" onclick="doCopy('code52912')"> 代码如下:<div class="codebody" id="code52912">
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

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读