博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[MSSQL2005]再看CTE
阅读量:5988 次
发布时间:2019-06-20

本文共 2295 字,大约阅读时间需要 7 分钟。

个人认为CTE最大的做点是可以处理树状存储的数据了

例如类似这样设计的数据表,ID,ParentID这样的设计使用CTE就非常方便,原因就是CTE可以自引用,达到类似递归的效果

那么问题来了,如何使用呢?

 

想深入学习CTE的看这里

 

想直接使用COPY下边的代码,F5看一眼即知,

 

#1 使用到的测试数据

DECLARE @CTEEXAMPLE TABLE

(
  EmployeeID int NOT NULL PRIMARY KEY,
  FirstName varchar(50) NOT NULL,
  LastName varchar(50) NOT NULL,
  ManagerID int NULL
)

INSERT INTO @CTEEXAMPLE VALUES (101, 'Ken', 'Sánchez', NULL)

INSERT INTO @CTEEXAMPLE VALUES (102, 'Terri', 'Duffy', 101)
INSERT INTO @CTEEXAMPLE VALUES (103, 'Roberto', 'Tamburello', 101)
INSERT INTO @CTEEXAMPLE VALUES (104, 'Rob', 'Walters', 102)
INSERT INTO @CTEEXAMPLE VALUES (105, 'Gail', 'Erickson', 102)
INSERT INTO @CTEEXAMPLE VALUES (106, 'Jossef', 'Goldberg', 103)
INSERT INTO @CTEEXAMPLE VALUES (107, 'Dylan', 'Miller', 103)
INSERT INTO @CTEEXAMPLE VALUES (108, 'Diane', 'Margheim', 105)
INSERT INTO @CTEEXAMPLE VALUES (109, 'Gigi', 'Matthew', 105)
INSERT INTO @CTEEXAMPLE VALUES (110, 'Michael', 'Raheem', 106);

 

 

 

#2 CTE递归查询

DECLARE @CTEEXAMPLE TABLE

(
  EmployeeID int NOT NULL PRIMARY KEY,
  FirstName varchar(50) NOT NULL,
  LastName varchar(50) NOT NULL,
  ManagerID int NULL
)

INSERT INTO @CTEEXAMPLE VALUES (101, 'Ken', 'Sánchez', NULL)

INSERT INTO @CTEEXAMPLE VALUES (102, 'Terri', 'Duffy', 101)
INSERT INTO @CTEEXAMPLE VALUES (103, 'Roberto', 'Tamburello', 101)
INSERT INTO @CTEEXAMPLE VALUES (104, 'Rob', 'Walters', 102)
INSERT INTO @CTEEXAMPLE VALUES (105, 'Gail', 'Erickson', 102)
INSERT INTO @CTEEXAMPLE VALUES (106, 'Jossef', 'Goldberg', 103)
INSERT INTO @CTEEXAMPLE VALUES (107, 'Dylan', 'Miller', 103)
INSERT INTO @CTEEXAMPLE VALUES (108, 'Diane', 'Margheim', 105)
INSERT INTO @CTEEXAMPLE VALUES (109, 'Gigi', 'Matthew', 105)
INSERT INTO @CTEEXAMPLE VALUES (110, 'Michael', 'Raheem', 106);

WITH cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)

AS
  (
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM @CTEEXAMPLE
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel + 1
    FROM @CTEEXAMPLE e
      INNER JOIN cteReports r ON e.ManagerID = r.EmpID
  )
SELECT
    R.EmpID,R.FirstName + R.LastName 'fullName',R.MgrID,R.EmpLevel,
    'Employee<----|---->Manager',
    C.FirstName + C.LastName 'fullName'
FROM cteReports R
    LEFT JOIN @CTEEXAMPLE C ON R.MgrID = C.EmployeeID
ORDER BY EmpLevel, MgrID

 

转载于:https://www.cnblogs.com/kkun/p/CTE.html

你可能感兴趣的文章
Android音频开发(6):使用 OpenSL ES API(上)
查看>>
windows 2008 R2下(AD RMS)无法检索证书层次结构的解决方法
查看>>
通过md5sum命令制造CPU负载或压力
查看>>
[3/04]域环境中出现“终结点不可用”的解决方法
查看>>
新版百度地图界面背后的故事
查看>>
联想第三季:PC+时代的航母启航?
查看>>
C语言位操作实例
查看>>
slackware开启mysql服务
查看>>
UNIX & Linux 将字符串转换成命令执行
查看>>
行为驱动开发Behaviour Driven Development
查看>>
Struts2中的Blob格式文件上传下载
查看>>
实用window 2008之四:用批处理添加/修改多个域账户
查看>>
LoadRunner在使用时遇到的问题及解决方法
查看>>
Exchange Server 2010 EMC打开报错故障处理
查看>>
8088 汇编速查手册
查看>>
MMO移动游戏性能分析报告:渲染、UI、逻辑代码和内存需重点关注
查看>>
SQL Server 2014新功能 -- 延迟事务持久性(Delayed Transaction Durability)
查看>>
Linux RDS Protocol Local Privilege Escalation
查看>>
mysql——Linux下安装max-4.1.14
查看>>
Spring--Spring容器
查看>>