SqlServer 2005 T-SQL Query 学习笔记(4)
2010-02-18 21:24
651 查看
作者他很喜欢建立数字辅助表(即是1-N的数字按顺序组成的表),关于如何建立这些辅助表,然后他给了一些例子,这些例子很有代表性。
比如,我要建立一个1,000,000行的数字表:
这种方式非常巧妙,它并不是一个一个的循环插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。
为什么这样会快呢?
是因为它节省了跟比较其他可用解决方案和记录这些日志的时间。
然后,作者给了一个CTE的递归的解决方案:
有个更优的CTE的解决方案,就是先生成很多行,然后用ROW_NUMBER进行计算,再选择ROW_NUMBER这列的值就可以了。
Technorati标签:sql2005,t-sql,query
比如,我要建立一个1,000,000行的数字表:
CREATE TABLEdbo.Nums(n INT NOT NULL PRIMARY KEY); DECLARE@ max AS INT,@rc AS INT; SET@ max=1000000; SET@rc=1; INSERT INTONums VALUES(1); WHILE@rc*2<=@ max BEGIN INSERT INTOdbo.Nums SELECTn+@rc FROMdbo.Nums; SET@rc=@rc*2; END INSERT INTOdbo.Nums SELECTn+@rc FROMdbo.Nums WHEREn+@rc<=@ max;
这种方式非常巧妙,它并不是一个一个的循环插入,而是一次插入很多行,{1},{2},{3,4},{5,6,7,8}。。。
为什么这样会快呢?
是因为它节省了跟比较其他可用解决方案和记录这些日志的时间。
然后,作者给了一个CTE的递归的解决方案:
DECLARE@n AS BIGINT; SET@n=1000000; WITHNums AS ( SELECT1 ASn UNION ALL SELECTn+1 FROMNums WHEREn<@n ) SELECTn FROMNums OPTION(MAXRECURSION0);--为了移除默认100的递归限制
有个更优的CTE的解决方案,就是先生成很多行,然后用ROW_NUMBER进行计算,再选择ROW_NUMBER这列的值就可以了。
DECLARE@n AS BIGINT; SET@n=1000000; WITHBase AS
(SELECT1 ASn UNION ALL SELECTn+1 FROMBase WHEREn<CEILING(SQRT(@n))
),
ExpandAS
(SELECT1 ASc FROMBase ASB1,Base ASB2
),
NumsAS
(SELECTROW_NUMBER() OVER( ORDER BYc) ASn FROMExpand
)SELECTn FROMNums WHEREn<=@n OPTION(MAXRECURSION0);
利用笛卡尔积进行不断的累加,达到了22n行。
最后,作者给出了一个函数,用于生成这样的数字表:
CREATE FUNCTIONdbo.fn_nums(@n AS BIGINT) RETURNS TABLE AS RETURN WITH
L0AS( SELECT1 ASc UNION ALL SELECT1),
L1AS( SELECT1 ASc FROML0 ASA,L0 ASB),
L2AS( SELECT1 ASc FROML1 ASA,L1 ASB),
L3AS( SELECT1 ASc FROML2 ASA,L2 ASB),
L4AS( SELECT1 ASc FROML3 ASA,L3 ASB),
L5AS( SELECT1 ASc FROML4 ASA,L4 ASB),
NumsAS( SELECTROW_NUMBER() OVER( ORDER BYc) ASn FROML5) SELECTn FROMNums WHEREn<=@n; GO
Technorati标签:
相关文章推荐
- SqlServer 2005 T-SQL Query 学习笔记(9)
- SqlServer 2005 T-SQL Query 学习笔记(5)
- SqlServer 2005 T-SQL Query 学习笔记(1)
- SqlServer 2005 T-SQL Query 学习笔记
- SqlServer 2005 T-SQL Query 学习笔记
- SqlServer 2005 T-SQL Query 学习笔记(6)
- SqlServer 2005 T-SQL Query 学习笔记(2)
- SqlServer 2005 T-SQL Query 学习笔记(8)
- SqlServer 2005 T-SQL Query 学习笔记(7)
- SqlServer 2005 T-SQL Query 学习笔记(1)
- SqlServer 2005 T-SQL Query 学习笔记(2)
- SqlServer 2005 T-SQL Query 学习笔记(3)
- SqlServer 2005 T-SQL Query 学习笔记(3)
- SqlServer 2005 T-SQL Query 学习笔记(10)
- SqlServer 2005 T-SQL Query 学习笔记(4)
- SQLSERVER2005学习笔记
- SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
- Delphi2005学习笔记5 NET Interoperability: .NET ↔ Win32
- SQL Server 2005 T-SQL 学习笔记:新数据类型
- sql server 2005学习笔记之触发器简介