欢迎大家来到IT世界,在知识的湖畔探索吧!
递归的常见形式
WITH CTE AS (
SELECT column1,column2… FROM tablename WHERE conditions
UNION ALL
SELECT column1,column2… FROM tablename
INNER JOIN CTE ON conditions
)
递归查询示例
创建测试数据,有一个员工表Company,父级ID是部门ID的父节点,这是一个非常简单的层次结构模型。
USE SQL_Road
GO
CREATETABLE Company
(
部门IDINT,
父级IDINT,
部门名称 VARCHAR(10)
)
INSERTINTO Company VALUES
(1,-1,‘总部’),
(11,1,‘财务中心’),
(12,1,‘人力中心’),
(13,1,‘信息中心’),
(111,11,‘会计组’),
(112,11,‘出纳组’),
(121,12,‘薪酬组’)
查询一下Company表里的数据
欢迎大家来到IT世界,在知识的湖畔探索吧!
查询每个部门的的直接上级ID
WITH CTE AS(
SELECT 部门ID,父级ID,部门名称,部门名称 AS 父级部门名称
FROM Company
WHERE 父级ID=-1
UNION ALL
SELECT c.部门ID,c.父级ID,c.部门名称,p.部门名称 AS 父级部门名称
FROM CTE P
INNERJOIN Company c ON p.部门ID=c.父级ID
)
SELECT 部门ID,父级ID,部门名称,父级部门名称
FROM CTE
结果如下:
我们来解读一下上面的代码
1、查询父级ID=-1,作为根节点,这是递归查询的起始点。
2、迭代公式是 UNION ALL 下面的查询语句。在查询语句中调用中CTE,而查询语句就是CTE的组成部分,即 “自己调用自己”,这就是递归的真谛所在。
所谓迭代,是指每一次递归都要调用上一次查询的结果集,UNION ALL是指每次都把结果集并在一起。
3、迭代公式利用上一次查询返回的结果集执行特定的查询,直到CTE返回NULL或达到最大的迭代次数,默认值是32。最终的结果集是迭代公式返回的各个结果集的并集,求并集是由UNION ALL 子句定义的,并且只能使用UNION ALL
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/136429.html