2017-09-27 78 views
0

考慮包含有關目錄結構的信息如下表:創建路徑組件路徑字符串

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; 

enter image description here

從該表應該可以得到一個包含路徑名稱的列

"" 
"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; 

enter image description here

如何從這裏着手?

+0

請注意:你不能假設你的ROWID是不變的! –

+0

@LS_ᴅᴇᴠ好點,我已經改變了這個例子,使rowid不被使用 –

回答

1

是的,你使用WITH必須使用遞歸,這在SQLite的可實現:

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; 
+0

我無法得到這個工作,它繼續前進,沒有回來。 –

+0

是的,因爲(1,「」,1)'。這應該是'(1,「,NULL)'。 –

+0

即,根節點應該沒有父節點(而不是自己的父節點!) –