【问题标题】:SQLite : Select from the end of tree to the topSQLite:从树的末尾选择到顶部
【发布时间】:2014-05-07 15:30:38
【问题描述】:

从这个很棒的answer,现在我可以正确地实现递归查询了,

我还有一个问题,

第一:

我创建一个表:

 CREATE TABLE tree(
 id_tree integer PRIMARY KEY AUTOINCREMENT,
 id_boss TEXT,
 id_child TEXT,
 answ TEXT);

插入一些值:

 INSERT INTO tree(id_boss,id_child,answ) VALUES('1','2','T');
 INSERT INTO tree(id_boss,id_child,answ) VALUES('1','3','F');
 INSERT INTO tree(id_boss,id_child,answ) VALUES('2','P1','T');
 INSERT INTO tree(id_boss,id_child,answ) VALUES('2','4','F');
 INSERT INTO tree(id_boss,id_child,answ) VALUES('3','P2','T');
 INSERT INTO tree(id_boss,id_child,answ) VALUES('3','8','F');

然后我从这个很棒的answer 运行递归查询:

WITH RECURSIVE
under_alice(name,level,order_nr) AS (
  VALUES('1','0',0)
  UNION ALL
  SELECT tree.id_child, under_alice.level+1, tree.id_tree
    FROM tree, under_alice
   WHERE tree.id_boss=under_alice.name 
   ORDER BY 2 DESC, 3
)
SELECT substr('..........',1,level*3) || name FROM under_alice;

结果会是这样的:

  1
  ...2
  ......P1
  ......4
  ...3
  ......P2
  ......8

“已编辑” ------>

我的问题是,这是否可以扭转它, 例如我选择 id_child = 'P2',结果将是:

  P2
  3
  1

如果我选择 id_child = 'P1'

  P1
  2
  1

【问题讨论】:

  • 节点123 不在同一级别。您真的希望它们具有相同的... 缩进吗?
  • @cl no ,我只是想显示数值,而不是级别,我编辑了我的问题,请再次查看我的问题。

标签: sqlite


【解决方案1】:

递归查询从P1开始:

VALUES('P1')

在递归步骤中,我们通过查找该条目的 id_boss 值从某个记录 (ancestor) 转到其父项:

SELECT tree.id_boss
FROM tree JOIN ancestor ON tree.id_child = ancestor.id

一切都在一起:

WITH RECURSIVE
ancestor(id) AS (
    VALUES('P1')
    UNION ALL
    SELECT tree.id_boss
    FROM tree JOIN ancestor ON tree.id_child = ancestor.id
)
SELECT id FROM ancestor;

【讨论】:

  • 非常感谢,感谢您帮助我,感谢您帮助我理解代码,再次感谢您,您救了我。
  • 嘿,我还有另一个问题,是否可以不选择具有F 值的 id_boss ?所以如果我选择P2,结果将只是3F 中的值F 不会出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多