Bằng cách mô tả của bạn tôi giả sử bạn có nghĩa là breadth- đặt hàng đầu tiên, có thể được thực hiện bằng easly một vỚI truy vấn đệ quy (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;
Bạn cũng có thể sử dụng để sâu-đầu tiên sử dụng sau 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;
Nguồn
2010-09-14 17:44:49
Thx cho điều đó, tôi đã không nhận thức được các truy vấn WITH hiện tại trong Postgres – canni
Tôi nghĩ rằng chúng tôi không thể sử dụng câu lệnh UNION trong mệnh đề WITH – Fer
Giải pháp của bạn cho thứ tự độ sâu đầu tiên sẽ không hoạt động đối với id với số chữ số khác nhau. – synergetic