栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有三个表的递归CTE

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有三个表的递归CTE

您需要跟踪开始时使用的原始ID。试试这个:

DECLARE @ORG_PARENTS TABLE (ORG_ID INT, ORG_PARENT INT ) DECLARE @MANAGERS TABLE (ORG_ID INT, MANAGER VARCHAr(100))INSERT @ORG_PARENTS (ORG_ID, ORG_PARENT)VALUES  (1, NULL),       (2, 1),       (3, 2)INSERT @MANAGERS (ORG_ID, MANAGER)VALUES (1, 'John Doe'),       (2, 'Jane Doe'),       (3, NULL);WITH BOSSAS(     SELECt      m.MANAGER, m.ORG_ID AS ORI, m.ORG_ID, p.ORG_PARENT, 1 cnt    FROM        @MANAGERS m     INNER JOIN  @ORG_PARENTS p      ON p.ORG_ID = m.ORG_ID    UNIOn ALL    SELECt      m1.MANAGER, b.ORI, m1.ORG_ID, OP.ORG_PARENT, cnt +1    FROM        BOSS b    INNER JOIN  @ORG_PARENTS AS OP ON  OP.ORG_ID = b.ORG_PARENT    INNER JOIN  @MANAGERS m1  ON  m1.ORG_ID = OP.ORG_ID )SELECt  * FROM    BOSS WHERe   ORI = 3

结果是:

+----------+-----+--------+------------+-----+| MANAGER  | ORI | ORG_ID | ORG_PARENT | cnt |+----------+-----+--------+------------+-----+| NULL     |   3 |      3 | 2          |   1 || Jane Doe |   3 |      2 | 1          |   2 || John Doe |   3 |      1 | NULL       |   3 |+----------+-----+--------+------------+-----+

一般提示:

不要预定义CTE的列;这是不必要的,并且使维护变得烦人。

使用递归CTE时,始终要保留一个计数器,这样您就可以限制递归性,并且可以跟踪自己的深度。

编辑:

顺便说一句,如果您想要第一个不是null的管理器,则可以这样做(例如,有很多方法):

SELECt  BOSS.* FROM    BOSS INNER JOIN (     SELECt  BOSS.ORI     ,       MIN(BOSS.cnt) cnt     FROM    BOSS     WHERe   BOSS.MANAGER IS NOT NULL     GROUP BY BOSS.ORI  ) X        ON  X.ORI = BOSS.ORI        AND X.cnt = BOSS.cntWHERe   BOSS.ORI IN (3)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/612162.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号