SQLite递归查询仅执行一步即终止,如何排查解决?
问题原因
你的递归查询核心问题出在递归成员返回的字段不对:
- 锚点查询返回的是起始用户的
login(john的login是'john') - 但递归部分返回的是下属的
nickname(比如bob的nickname是'b'),而后续递归需要用login去匹配下一层员工的manager字段(steve的manager是'bob',也就是bob的login),这时候orgtree里存的是'b'(nickname),和'bob'(login)不匹配,导致递归到bob就断了,没法找到steve。
修正后的递归查询
要让递归能持续传递用于关联的login值,同时可以顺便带上nickname方便直接输出:
WITH orgtree AS ( -- 锚点:通过nickname找到起始用户的login和nickname SELECT login, nickname FROM users WHERE nickname='j' UNION ALL -- 递归成员:返回下属的login(用于继续递归)和nickname(用于结果) SELECT u.login, u.nickname FROM users u JOIN orgtree ot ON u.manager = ot.login ) -- 直接从递归结果中取出所有nickname SELECT nickname FROM orgtree;
补充说明
- 执行上述查询会返回包含起始用户在内的所有层级nickname:
j、l、b、s - 如果不需要包含起始用户本身,只需在最后查询时添加过滤条件:
SELECT nickname FROM orgtree WHERE nickname != 'j';
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

