一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Sql Server - SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(4)

SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(4)

2020-06-30 14:58MSSQL教程網(wǎng) Sql Server

作者他很喜歡建立數(shù)字輔助表(即是1-N的數(shù)字按順序組成的表),關(guān)于如何建立這些輔助表,然后他給了一些例子,這些例子很有代表性。

比如,我要建立一個1,000,000行的數(shù)字表:

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;




這種方式非常巧妙,它并不是一個一個的循環(huán)插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。



為什么這樣會快呢?

是因為它節(jié)省了跟比較其他可用解決方案進(jìn)行比較和記錄這些日志的時間。



然后,作者給了一個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);--為了移除默認(rèn)100的遞歸限制


有個更優(yōu)的CTE的解決方案,就是先生成很多行,然后用ROW_NUMBER進(jìn)行計算,再選擇ROW_NUMBER這列的值就可以了。

復(fù)制代碼 代碼如下:


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);



利用笛卡爾積進(jìn)行不斷的累加,達(dá)到了22n行。

最后,作者給出了一個函數(shù),用于生成這樣的數(shù)字表:

復(fù)制代碼 代碼如下:


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩亚洲成人 | 日日舔 | 成人国产精品视频 | 色多多影院 | 九九精品成人免费国产片 | 99国产热| 日本花季传媒2020旧版安卓 | 免费成人在线观看视频 | 日本在线播放视频 | 色多多绿巨人视频 | 国产九九热视频 | 久久嫩草影院网站 | 国产精品视频一区二区三区w | 日韩天堂视频 | 国产普通话对白露脸流出 | 四虎影视网址 | 午夜福利电影网站鲁片大全 | 婷婷综合缴情亚洲五月伊 | 青草青草久热精品视频在线网站 | 亚洲高清中文字幕 | 欧美一区不卡二区不卡三区 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 久久亚洲精品AV成人无 | 亚洲天堂免费 | 狠狠五月天中文字幕 | 欧美一区二区三 | 8mav福利视频 | 97青草香蕉依人在线播放 | 操美女骚b | 高h短篇辣肉各种姿势bl | 国产最新精品视频 | 亚洲 小说 欧美 激情 另类 | 成年男女免费视频观看性 | 国产成人综合网亚洲欧美在线 | 亚洲精品视频专区 | 贤妻良母电影日本 | 欧美一区二区三区成人看不卡 | 久久三级视频 | 娇小异类videos| 欧美日韩亚洲综合久久久 | 国产精品视频一区二区三区 |