国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SqlServer 2005 T-SQL Query 學習筆記(4)

2020-10-30 19:10:51
字體:
來源:轉載
供稿:網友
比如,我要建立一個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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苍梧县| 赫章县| 鹤峰县| 德保县| 望城县| 依兰县| 普陀区| 周宁县| 桐乡市| 全椒县| 秀山| 黄龙县| 庆云县| 乌什县| 梁山县| 卓尼县| 肇源县| 磐石市| 大厂| 射阳县| 砀山县| 威宁| 西昌市| 贵南县| 浏阳市| 伊川县| 赤峰市| 仁寿县| 射阳县| 雷山县| 滨州市| 新和县| 泰兴市| 临夏县| 历史| 大洼县| 当涂县| 五大连池市| 丹江口市| 崇左市| 越西县|