CTE(Common Table Expressions)简单介绍(四)
来源:互联网 发布:java 方法里套方法 编辑:程序博客网 时间:2024/04/28 18:45
CTE(Common Table Expressions)可以实现递归。以下用一个例子说明一下。
--定义一个表变量DECLARE @table TABLE(CategoryId INT IDENTITY(1,1) NOT NULL,CategoryName VARCHAR(20),ParentId INT)--弄点测试数据看看。INSERT INTO @table (CategoryName, ParentId)Values('Main 1', 0)INSERT INTO @table (CategoryName, ParentId)Values('Main 2', 0)INSERT INTO @table (CategoryName, ParentId)Values('Level 1-1', 1)INSERT INTO @table (CategoryName, ParentId)Values('Main 3', 0)INSERT INTO @table (CategoryName, ParentId)Values('Level 2-1', 3)INSERT INTO @table (CategoryName, ParentId)Values('Level 1-2', 1)---这个分号一定要的。不然会出错。;With Test_CTE AS(SELECT *, 0 as TreeLevel FROM @table WHERE ParentID=0UNION ALL ---开始递归。这里主要是把TreeLevel分出层次来。SELECT t.*, Test_CTE.TreeLevel+1 as TreeLevel FROM @table tINNER JOIN Test_CTE on t.ParentID = Test_CTE.CategoryId)SELECT * FROM Test_CTE
以上例子的CTE实现递归。把@table里的层次关系显示出来。
显示的结果如下:
CategoryId CategoryName ParentId TreeLevel
----------------- ------------------------ ----------------- ------------
1 Main 1 0 0
2 Main 2 0 0
3 Main 3 0 0
4 Level 1-1 1 1
6 Level 1-2 1 1
5 Level 2-1 3 2
设计递归的时候,一定要防止死循环。这个,MSSQL有个解决方案,就是在CTE的使用里,加入一个OPTION, MAXRECURSION。
--在这个例子里,会有错误提示。With Test_CTE AS(SELECT *, 0 as TreeLevel FROM @table WHERE ParentID=0UNION ALL ---开始递归。这里主要是把TreeLevel分出层次来。SELECT t.*, Test_CTE.TreeLevel+1 as TreeLevel FROM @table tINNER JOIN Test_CTE on t.ParentID = Test_CTE.CategoryId)SELECT * FROM Test_CTEOPTION (MAXRECURSION 1); --没有逗号分开的。
因为在OPTION (MAXRECURSION 1)里限制了只递归一层。而我们的例子里面有2层,所以在递归到第二层的时候,就出错了。
--在这个例子里,不会有错误提示。With Test_CTE AS(SELECT *, 0 as TreeLevel FROM @table WHERE ParentID=0UNION ALL ---开始递归。这里主要是把TreeLevel分出层次来。SELECT t.*, Test_CTE.TreeLevel+1 as TreeLevel FROM @table tINNER JOIN Test_CTE on t.ParentID = Test_CTE.CategoryId)SELECT * FROM Test_CTEOPTION (MAXRECURSION 3); --没有逗号分开的。
以上的例子,因为限制的递给层数为3,而例子的层数是2层,所以顺利运行。
MAXRECURSION:限制在0和32767之间,0就是不限制。而默认值是100。
- CTE(Common Table Expressions)简单介绍(四)
- CTE(Common Table Expressions)简单介绍(一)
- CTE(Common Table Expressions)简单介绍(二)
- CTE(Common Table Expressions)简单介绍(三)
- 用 CTE (Common Table Expressions) 切割 string
- Common Table Expression(CTE)
- CTE(common table expression)
- Sql-Common Table Expression(CTE)
- 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
- 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
- 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
- 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
- 姚博文 cte 公用表表达式Common Table Expression
- Inline CTE number table
- More with SQL Server 2005 : Top n Per Group, Paging, and Common Table Expressions
- MariaDB and MySQL Common Table Expressions and Window Functions Revealed.pdf 英文原版 免费下载
- 读书笔记《Mastering Regular Expressions》(四)
- Chapter 05 - Table Expressions
- 自定义UITableViewCell实现ibooks类似的图书列表形式
- 换行符‘\n’和回车符‘\r’
- Excel 使用技巧集锦——163种技巧
- UITableViewCell的重绘机制导致的列状态问题
- Java面试
- CTE(Common Table Expressions)简单介绍(四)
- 确保对象的唯一性——单例模式 (一)
- 确保对象的唯一性——单例模式 (二)
- 确保对象的唯一性——单例模式 (三)
- 确保对象的唯一性——单例模式 (四)
- 确保对象的唯一性——单例模式 (五)
- 驱动框架
- 请求的链式处理——职责链模式(一)
- java基础 - 2