[MSSQL2005]再看CTE

news/2024/7/24 9:25:09

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

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

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

 

想深入学习CTE的看这里

http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER

https://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/

 

想直接使用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);

 

001CTE

 

 

#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

 002CTE

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


http://www.niftyadmin.cn/n/1382008.html

相关文章

编辑距离 dp

评测 f[i][j]表示a中前i个字符转化为b中前j个字符最短编辑距离。结果就应是f[l1][l2] 赋初值&#xff1a;a串空时&#xff0c;对应b中j个字符时最短距离就是j&#xff08;插入j个&#xff09;&#xff0c;f[0][i]i;(i<l2) 同理&#xff0c;f[i][0]i;(i<l1) 转移方程&…

Linux服务器---ssh配置

Ssh配置 通过配置文件&#xff0c;我们可以有效的管理ssh1、空闲时间关闭连接1&#xff09;修改配置文件“/etc/ssh/sshd_config”&#xff0c;设置clientAliveInterval和clientAliveCountMax&#xff0c;注意取消前面的注释[rootlocalhost wj]# gedit /etc/ssh/sshd_confClien…

Android学习 之 ColorStateList按钮文字变色

首先添加一个ColorStateList资源XML文件&#xff0c;XML文件保存在res/color/button_text.xml: Java代码 <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"> &…

【转】送给前线码农的话 – 大牛们的经典语录

2019独角兽企业重金招聘Python工程师标准>>> 随笔- 20 文章- 0 评论- 4 转自&#xff1a;http://www.cnblogs.com/liufeng24/p/3587556.html 近半年来&#xff0c;本人几乎天天逛各大论坛网站&#xff0c;浏览大牛们的博客&#xff0c;摘抄了不少经典的好词好段&…

【NetApp】console和SP的相互切换

From Console “ctrl g” to change to SP From Service Processor “ctrl d” to change to Console转载于:https://blog.51cto.com/acadia627/1968396

解决tcp粘包问题

目录什么是粘包(演示粘包现象)解决粘包实际应用什么是粘包首先只有tcp有粘包现象&#xff0c;udp没有粘包socket收发消息的原理发送端可以是一K一K地发送数据&#xff0c;而接收端的应用程序可以两K两K地提走数据&#xff0c;当然也有可能一次提走3K或6K数据&#xff0c;或者一…

textview滑动效果

网上很多在xml中改的我经过试验没用&#xff0c;可能是版本不兼容的原因&#xff0c;但在java代码中改有用head_tv1.setEllipsize(TextUtils.TruncateAt.MARQUEE);head_tv1.setSingleLine(true);head_tv1.setSelected(true);head_tv1.setFocusable(true);head_tv1.setFocusable…

[Android教程]EditText设置/隐藏光标位置、选中文本和获取/清除焦点

有时候需要让光标显示在EditText的指定位置或者选中某些文本。同样&#xff0c;为了方便用户输入以提升用户体验&#xff0c;可能需要使EditText获得或失去焦点。 1. 设置光标到指定位置 EditText et (EditText) findViewById(R.id.etTest);et.setSelection(2);PS&#xff1a;…