【问题标题】:create path string from path components从路径组件创建路径字符串
【发布时间】:2018-03-08 16:46:09
【问题描述】:

考虑下表包含有关目录结构的信息:

CREATE TABLE t (id INTEGER, name TEXT, parent INTEGER);
INSERT into t VALUES
(1, "", 1),
(2, "a", 1),
(3, "b", 2),
(4, "c", 3),
(5, "d", 1);

SELECT * FROM t;

从这个表中应该可以得到一个包含路径名的列

""
"a"
"a/b"
"a/b/c"
"d"

似乎某种递归是必要的。到目前为止,我只设法创建了父目录的文本列:

SELECT b.id, b.name name, b.parent parent, a.name as parent_name
FROM t a INNER JOIN t b ON a.id = b.parent;

如何从这里开始?

【问题讨论】:

  • 注意:你不能假设你的 rowid 是不可变的!
  • @LS_ᴅᴇᴠ 好点,我已经更改了示例,因此不使用 rowid

标签: sql sqlite recursion


【解决方案1】:

是的,您必须使用递归,这在 SQLite 中可以使用 WITH 来完成:

WITH RECURSIVE tf AS (
   SELECT id, name, parent, name AS full, parent AS p FROM t
UNION
    SELECT id, name, parent,
        (SELECT name FROM t WHERE id=tf.p) || "\" || full,
        (SELECT parent FROM t WHERE id=tf.p)
        FROM tf WHERE p IS NOT NULL
)
SELECT id, name, full FROM tf WHERE p IS NULL;

【讨论】:

  • 我无法让它工作,它一直在继续,永远不会返回。
  • 是的,因为(1, "", 1)。这应该是(1, "", NULL)
  • 即,根节点应该没有父节点(而不是自己的父节点!)
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 2016-11-09
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多