您需要跟踪开始时使用的原始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)



