sqlite 为什么我的递归查询在一步之后就停止了?

ht4b089n  于 2023-04-21  发布在  SQLite
关注(0)|答案(1)|浏览(148)

我想获取一个组织中最终向给定人员(组织结构图的扁平化子树)报告的员工列表。我创建了一个示例组织(在SQLite中为view on DB Fiddle),其中john作为老板,他有两个报告(lucbob),bob有一个报告(steve)。
为了给递归查询播种,我想使用nickname(并获得nickname的列表),但人们之间的关系是基于他们的login

create table users (
  login text,
  nickname text,
  manager text
  );
  
 insert into users values ('john', 'j',  NULL), ('luc', 'l', 'john'), ('bob', 'b', 'john'), ('steve', 's', 'bob');

我创建了一个递归查询

WITH orgtree AS (
select login  from users where users.nickname='j'

UNION all
    
SELECT users.nickname FROM users, orgtree
WHERE users.manager=orgtree.login
)

SELECT users.nickname FROM users
WHERE users.nickname IN orgtree ;

我得到的结果只是jjohn)的“第一行”:
| 绰号|
| --------------|
| l|
| B|
在我的查询中缺少了什么来进行更深入的查询?(在锚或递归成员中?)

v2g6jxz6

v2g6jxz61#

直接的问题是CTE的递归成员返回用户的昵称,而您需要他们的登录才能查找下一个层次结构级别。直接解决方法是:

with orgtree as (
    select login  from users where users.nickname='j'
    union all
    select users.login 
    from users, orgtree
    where users.manager=orgtree.login
)
select nickname from users where login in orgtree;

但是我们可以进一步改进查询,通过在递归中跟踪昵称 * 和登录名 *,所以在外部查询中不需要in

with orgtree as (
    select nickname, login from users where nickname = 'j'
    union all
    select u.nickname, u.login 
    from users u
    inner join orgtree o on u.manager = o.login
)
select nickname from orgtree

请注意,我使用的是标准的显式连接,而不是隐式的老式连接。

Demo on DB Fiddle

绰号
j
B
l
s

相关问题