can*_*nni 7 sql postgresql tree
我有表女巫包含字段:id,parent_id,name(等)
我想在"树旅行顺序"中订购此表,即.
id parent_id
1, 0
3, 1
5, 1
2, 0
8, 2
4, 0
9, 4
Run Code Online (Sandbox Code Playgroud)
(......)
总之描述:取根节点,追加所有子节点,取下一个根节点追加子节点等.
Dio*_*zus 10
根据你的描述,我假设你的意思是广度优先,可以使用WITH RECURSIVE查询(PostgreSQL 8.4+)轻松完成:
WITH RECURSIVE tree
AS
(
SELECT
node_name, id, parent_id, NULL::varchar AS parent_name
FROM foo
WHERE parent_id IS NULL
UNION
SELECT
node_name, f1.id, f1.parent_id, tree.node_name AS parent_name
FROM
tree
JOIN foo f1 ON f1.parent_id = tree.id
)
SELECT node_name, empno, parent_id, node_name FROM tree;
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下SQL来使用深度优先顺序:
WITH RECURSIVE tree
AS
(
SELECT
node_name, id, parent_id, NULL::varchar AS parent_name, id::text AS path
FROM foo WHERE parent_id IS NULL
UNION
SELECT
node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || '-' || f1.id::text AS path
FROM
tree
JOIN foo f1 ON f1.parent_id = tree.id
)
SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;
Run Code Online (Sandbox Code Playgroud)
小智 5
由于注意到了协同,通过提供深度优先顺序的解决方案迪奥戈Biazus会为ID不工作与不同的位数。
但是您可以改用此解决方案,它使用integer数组:
WITH RECURSIVE tree
AS
(
SELECT
node_name, id, parent_id, NULL::varchar AS parent_name, array[id] AS path
FROM foo WHERE parent_id IS NULL
UNION
SELECT
node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || f1.id AS path
FROM
tree
JOIN foo f1 ON f1.parent_id = tree.id
)
SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8438 次 |
最近记录: |