SQL Server CTE的一些实用例子[通俗易懂]

SQL Server CTE的一些实用例子[通俗易懂]一、引言 CTE(Common Table Expression) 公用表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效。它可以自引用,也可在同一查询中多次引用,实现了代码段的重复

SQL Server CTE的一些实用例子

一、引言

CTE(Common Table Expression) 公用表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效。它可以自引用,也可在同一查询中多次引用,实现了代码段的重复利用。

CTE最大的好处是提升T-Sql代码的可读性,可以以更加优雅简洁的方式实现递归等复杂的查询。

二、测试数据

CREATE TABLE [dbo].[Product](
    [PRD_ID] [INT] NOT NULL,
    [PRD_NAME] [VARCHAR](100) NULL,
    [UP] [NUMERIC](8, 2) NULL,
 CONSTRAINT [PK_Product] PRIMARY KEY NONCLUSTERED 
(
    [PRD_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (1,"鼠标",108)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (2,"键盘",108)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (3,"内存条",150)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (4,"硬盘",300)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (5,"主机",3000)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (6,"显示器",750)
INSERT INTO Product (PRD_ID,PRD_NAME,UP) VALUES (7,"U盘",35)
GO

三、实用例子

3.1、基本用法

WITH CTE1(ID,[NAME])
AS
(
    SELECT PRD_ID,PRD_NAME FROM PRODUCT
)
SELECT * FROM CTE1

3.2、多次引用

WITH CET1(ID,[NAME])
AS
(
    SELECT PRD_ID,PRD_NAME FROM PRODUCT WHERE PRD_ID<5
)
,CET2(ID,[NAME])
AS
(
    SELECT PRD_ID,PRD_NAME FROM PRODUCT WHERE PRD_ID<5
)
SELECT * FROM CET1
UNION ALL
SELECT * FROM CET2

3.3、分页

WITH CET1(ID,[NAME],[ROWID])
AS
(
    SELECT PRD_ID AS ID,PRD_NAME AS NAME,ROW_NUMBER() OVER (ORDER BY PRD_ID) AS ROWID
    FROM PRODUCT
)
SELECT * FROM CET1 WHERE ROWID BETWEEN 1 AND 5

3.4、递归

DECLARE @T TABLE (ID INT, ParentID INT)

INSERT INTO @T VALUES (1,NULL)
INSERT INTO @T VALUES (11,1)
INSERT INTO @T VALUES (12,1)
INSERT INTO @T VALUES (13,1)
INSERT INTO @T VALUES (1101,11)
INSERT INTO @T VALUES (1102,11)
INSERT INTO @T VALUES (1201,12)
INSERT INTO @T VALUES (1301,13)
INSERT INTO @T VALUES (1302,13)

;WITH CTE1 AS
(
    SELECT T.ID,T.PARENTID,1 AS [LEVEL]
    FROM @T AS T
    WHERE T.PARENTID IS NULL
    UNION ALL
    SELECT T.ID,T.PARENTID,CTE1.[LEVEL]+1 AS [LEVEL]
    FROM @T AS T INNER JOIN CTE1 ON CTE1.ID=T.PARENTID
)
SELECT * FROM CTE1 ORDER BY [LEVEL]

3.5、递归查询

查询某个节点下的所有节点。

DECLARE @T TABLE (ID INT, ParentID INT)

INSERT INTO @T VALUES (1,NULL)
INSERT INTO @T VALUES (11,1)
INSERT INTO @T VALUES (12,1)
INSERT INTO @T VALUES (13,1)
INSERT INTO @T VALUES (1101,11)
INSERT INTO @T VALUES (1102,11)
INSERT INTO @T VALUES (1201,12)
INSERT INTO @T VALUES (1301,13)
INSERT INTO @T VALUES (1302,13)

;WITH CTE1 AS
(
    SELECT T.ID,T.PARENTID,1 AS [LEVEL]
    FROM @T AS T
    WHERE T.PARENTID=11
    UNION ALL
    SELECT T.ID,T.PARENTID,CTE1.[LEVEL]+1 AS [LEVEL]
    FROM @T AS T INNER JOIN CTE1 ON CTE1.ID=T.PARENTID
)
SELECT * FROM CTE1 ORDER BY [LEVEL]

3.6、生成连续数字

WITH GCN
AS
(
    SELECT 0 AS ID
    UNION ALL
    SELECT ID+1 FROM GCN WHERE ID<2047
)
--MAXRECURSION:控制递归的最⼤次数
SELECT ID FROM GCN OPTION (MAXRECURSION 2047)

3.7、生成连续日期

WITH GCD
AS
(
    SELECT CAST("2022-05-01" AS DATE) AS [DATE]
    UNION ALL
    SELECT DATEADD(D,1,[DATE]) FROM GCD WHERE [DATE]<"2022-05-31"
)
SELECT [DATE] FROM GCD

3.8、生成连续间隔时间点

WITH GCT
AS
(
    SELECT 1 AS ID,CAST("00:00:00" AS TIME(0)) AS TC
    UNION ALL
    SELECT ID+1 AS ID,CAST(DATEADD(MI,30,TC) AS TIME(0)) AS TC FROM GCT WHERE ID<49
)
SELECT * FROM GCT

 

原文地址:https://www.cnblogs.com/atomy/archive/2022/05/13/16265307.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5273.html

(0)
上一篇 2023-05-16
下一篇 2023-05-16

相关推荐

  • 北京哪里可以开住宿费发票

    北京哪里可以开住宿费发票电13564998196 幵-真-嘌,百-分-百-真。-本报讯(劳动报记者陆燕婷)聚焦餐饮行业,58同城招聘研究院昨 发布数据显示,今年上半年,全国餐饮行业招聘需求增长46.18%,平均月薪6387…

    2023-02-15
    147
  • Python工程师必备开发环境——Spyder 5.3.3

    Python工程师必备开发环境——Spyder 5.3.3Python语言已经成为目前最受欢迎的编程语言之一,其在数据分析、机器学习、科学计算等领域的应用越来越广泛。而一个优秀的Python开发环境是Python工程师必不可少的工具之一。Spyder 5.3.3以其易用性和高效性备受开发者喜爱,本文将详细介绍Spyder 5.3.3的优点和使用方法。

    2024-07-28
    38
  • 当 SQL DELETE 邂逅 Table aliases,会擦出怎样的火花「建议收藏」

    当 SQL DELETE 邂逅 Table aliases,会擦出怎样的火花「建议收藏」开心一刻 晚上,女儿眼噙泪水躺在床上 女儿:你口口声声说爱我,说陪我,却天天想着骗我零花钱,你是我亲爹吗? 我:你想知道真相 女儿:想! 我:那你先给爸爸两百块钱! 环境准备 MySQL 不同版本 利

    2023-06-05
    145
  • 初识Hadoop的三种安装模式「终于解决」

    初识Hadoop的三种安装模式「终于解决」特点:高可靠性(不怕丢)、高效性(处理速度快)、高容错性 ps:使用Hadoop版本: 接下来所用到的Hadoop2.8.5,虽然目前Hadoop已经更新到3.x了;但是我们始终秉持一个观点“用旧不用

    2023-04-19
    151
  • 用Python遍历List的方法

    用Python遍历List的方法在Python中,List是一种常见的数据类型,它可以保存任意类型的对象,包括数字、字符串、甚至是其他List等。对于处理List中的元素,最基本的就是遍历操作,也就是依次访问List中的每个元素。本文将从多个方面对用Python遍历List的方法进行详细阐述。

    2024-08-23
    24
  • Scrapy安装教程

    Scrapy安装教程Scrapy是一个开源的Python框架,主要用于爬取web站点并从中提取结构化的数据。它可以快速高效地处理大量数据,并带有强大的数据提取和处理功能。同时,它还支持分布式爬虫和扩展性很强的插件。

    2024-09-02
    26
  • sql在视图中查询_sql中的子查询的用法

    sql在视图中查询_sql中的子查询的用法前几篇我们一起学习了 SQL 如何对表进行创建、更新和删除操作、SQL SELECT WHERE 语句如何指定一个或多个查询条件 和 SQL 如何插入、删除和更新数据 等数据库的基本操作方法。 从本文

    2023-05-21
    204
  • How to connect to mongodb on centos7[亲测有效]

    How to connect to mongodb on centos7[亲测有效]sample [lwk@qwfys:~]$ mongo -u lanzhou mongodb://vm88.lan/lanzhou MongoDB shell version v4.2.8 Ente…

    2023-03-22
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注