`

T-SQL查询学习笔记——快速生成数字辅助表的几种方法示例代码

阅读更多

---------------------------------------------------------------------
-- Auxiliry Table of Numbers
---------------------------------------------------------------------

-- Listing 4-8: Creating and Populating Auxiliary Table of Numbers
SET NOCOUNT ON;

GO
IF OBJECT_ID('dbo.Nums') IS NOT NULL
  DROP TABLE dbo.Nums;
GO
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;
GO


drop table nums


-- Naive Solution Returning an Auxiliary Table of Numbers
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);
GO

-- Optimized Solution 1
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);
GO

-- Optimized Solution 2
DECLARE @n AS BIGINT;
SET @n = 1000000;

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

-- Listing 4-9: UDF Returning an Auxiliary Table of Numbers
IF OBJECT_ID('dbo.fn_nums') IS NOT NULL
  DROP FUNCTION dbo.Nums;
GO
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

-- Test function
SELECT * FROM dbo.fn_nums(10) AS F;
GO

分享到:
评论

相关推荐

    sql server 2012 T-SQl基础教程 源码和示例数据库

    《SQL Server 2012 T-SQL基础教程——源码与示例数据库》 本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程...

    T-SQL性能调优秘笈 基于SQL Server2012窗口函数.rar

    1、处理常见业务问题,如总计、间隔、...3、T-SQL性能调优秘笈:基于SQL Server 2012窗口函数》基于SQLServer2012,讨论了SQL窗口、窗口函数、排序集合函数、窗口函数的优化以及利用窗口函数的T-SQL解决方案等内容。

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

     书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。  本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库...

    T-SQL Querying 源代码

     书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。  本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库...

    C#代码生成器(包括T-sql语句,和实体类代码)

    总结起来,"C#代码生成器(包括T-sql语句,和实体类代码)"是一个高效开发工具,它结合了反射、动态加载和代码生成等技术,帮助开发者快速生成T-SQL语句和实体类代码,降低了开发复杂性和维护成本。对于.NET开发者来...

    Microsoft SQL Server 2008技术内幕:T-SQL查询_源代码及附录A

    "TSQLQuerying20090710.zip"这个文件很可能包含了书中所有示例的源代码,读者可以通过这些代码直接在SQL Server环境中执行,以便更好地理解和学习T-SQL查询的实际应用。这些源代码对于动手实践和解决问题来说是非常...

    T-SQL递归函数打印杨辉三角

    以下是一个基本的T-SQL递归函数示例,用于生成杨辉三角: ```sql WITH RECURSIVE TriangularNumber AS ( -- 基线条件:第0行 SELECT 0 AS Row, 1 AS Num UNION ALL -- 递归条件:从上一行生成下一行 SELECT t....

    Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 2

    Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 第二部分 第一部分地址:http://download.csdn.net/source/2684220

    学习笔记——sql.zip

    "学习笔记——sql.zip"这个压缩包文件很可能包含了关于SQL的学习资料,如教程、笔记、示例代码等,旨在帮助用户掌握SQL的基本概念、语法和高级特性。 首先,SQL的基础知识包括数据类型,如整型(INT)、浮点型...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...

    SQL Server2005 T-SQL 概述

    在T-SQL查询执行期间,系统会生成一个虚拟表(VT),这个VT在查询完成前对于调用者是不可见的。查询的每一步都会产生一个新的VT,作为下一步骤的输入,直至最终步骤,其中的数据会被返回给调用者。整个过程可以概括为...

    SQL Server 2005 技术内幕之T-SQL编程原版CHM

    该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...

    存储过程嵌入脚本——让T-SQL访问外部对象.pdf

    本文将深入探讨一种技术,该技术涉及将T-SQL(Transact-SQL,微软SQL Server的SQL扩展)存储过程与外部对象相结合,特别是如何通过T-SQL访问并操作如Microsoft Excel电子表格等非SQL Server对象的数据。 首先,文章...

    Mybatis 学习笔记——原生DAO实现数据增删改查SQL

    Mybatis 学习笔记——原生DAO实现数据增删改查SQL:https://blog.csdn.net/qq_24598601/article/details/83037252

    Transact-SQL权威指南

    《Transact-SQL权威指南》是一本深入探讨SQL在数据库管理中的应用的书籍,主要针对Transact-SQL,这是Microsoft SQL Server所使用的SQL方言。本书旨在帮助读者掌握T-SQL的高级技巧,优化性能,并利用其强大的功能...

    语法树学习笔记——数据库实现原理

    ### 语法树学习笔记——数据库实现原理 #### 5.2 写SQL语句-画语法树-逻辑查询计划-简单优化(选择、投影) ##### 5.2.1 写SQL语句 本节主要介绍了如何编写基本的SQL查询语句,并通过一个示例来解释SQL语法的基本...

    Spring MVC Ibatis Bean 根据mysql数据表——代码生成工具

    标题中的“Spring MVC Ibatis Bean 根据mysql数据表——代码生成工具”就是这样的一个工具,它能够根据MySQL数据库中的表结构,快速生成符合Spring MVC和Ibatis框架的代码。 Rapid-generator-0.2v可能是这个工具的...

    第5章 关系数据库语言——T-SQL(2006_研).ppt

    第5章 关系数据库语言——T-SQL(2006_研)

    SQL Server 2005技术内幕系列打包(涵盖4本PDF).part3

    ——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...

Global site tag (gtag.js) - Google Analytics