个人认为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);

 

 

 

#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

 

[MSSQL2005]再看CTE的更多相关文章

  1. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  2. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  3. 再看 AspriseOCR - OCR应用开发 -20151124

    再看 AspriseOCR - OCR应用开发 我写这个博文时间为 2015/11/24日,注意时间因为,网上很多文章时间上很久远,有的已经不能参考了 很多人面对从图片中识别文字或者数字0~9  A~ ...

  4. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  5. 再看case语句

    再看case语句,case语句只处理单条记录,而不是set 列名的使用,可以当做数值来使用: case when 后面简直是完美的的,什么东西都是能放的,只要是一个逻辑上的true/false的逻辑就 ...

  6. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

  7. python基础----再看property、描述符(__get__,__set__,__delete__)

    一.再看property                                                                          一个静态属性property ...

  8. perf使用的问题,再看perf record,perf record 设置的采样频率,采样频率是如何体现在

    当perf stat -e branches 是统计 再看perf record,perf record是为了是记录时间发生的时候的调用栈, 在我的测试代码中总共有200,000,000条branch ...

  9. 再看Scrapy(1) 基本概念

    再看Scrapy(1) 基本概念 1 准备 安装scrapy: 国内镜像源(官方的pypi不稳定)安装 pip3 install -i https://pypi.douban.com/simple/ ...

随机推荐

  1. TListView的一些操作

    1,让滚动条滚动的API SetScrollPos int SetScrollPos(     _In_  HWND hWnd,     _In_  int nBar,     _In_  int n ...

  2. Mybatis按SQL查询字段的顺序返回查询结果

    在SpringMVC+Mybatis的开发过程中,可以通过指定resultType="hashmap"来获得查询结果,但其输出是没有顺序的.如果要按照SQL查询字段的顺序返回查询结 ...

  3. 查看某个线程占得CPU高

    jps得到pid pidstat -p [pid] -t 1 5        -t表示显示该进程里面所有的线程的信息 06:20:32 PM      TGID       TID    %usr ...

  4. nginx环境下配置nagios-关于commands.cfg

    -w $ARG1$ -c $ARG2$ -M -b% -c % -f% -c % -f% -c % -f #  define command{         command_name    chec ...

  5. html中的块元素(Block)和内联元素(Inline)(转)

    我们首先要了解,所有的html元素,都要么是块元素(block).要么是内联元素(inline).下面了解一下块元素.内联元素各自的特点: 块元素(block)的特点: 1.总是在新行上开始:2.高度 ...

  6. hdu 1577 WisKey的眼神 (数学几何)

    WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. rem 和 ::

    -------siwuxie095 rem 和 ::   都是用作批处理注解(等同于各种编程语言中的注释) 注解批处理时,标准写法是写在被注解代码的上一行 REM 在批处理文件或CONFIG.SYS里 ...

  8. java基础之:堆排序

    最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足. 今天所实现的堆排序(最大堆) ...

  9. win8.1 vs2010 C++环境下 编译Android Adb.exe

    1 IntelliSense: cannot open source file "usb100.h"  adb 这是因为没有安装sdk造成的.win7下安装wdk,vs2010能够 ...

  10. 发布一个UDP调试助手

    UDP协议适用于那种频繁通信,但是可以容忍一些丢包的应用,比如GPS的定位应用. 调试UDP助手,可以定时发送,输出文本, 记录收到时间. 1. 该工具基于IOCP网络模型,调试UDP服务使用的一个工 ...