다음 nodes
과 같은 테이블이 있다고 가정 해 봅시다 .
CREATE TABLE nodes
(
node serial PRIMARY KEY,
parent integer NULL REFERENCES nodes(node),
ts timestamp NOT NULL DEFAULT now()
);
루트 노드가 최상위 노드에 있고 루트 노드 또는 다른 하위 노드에서 매달려있는 여러 하위 노드가있는 표준 노드 형 트리 구조를 나타냅니다.
몇 가지 예제 값을 삽입하겠습니다.
INSERT INTO nodes (parent)
VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1)
, (6), (9), (6), (6), (3), (3), (3), (15);
이제 처음 10 개의 루트 노드와 모든 하위 노드를 4 단계까지 검색하려고합니다.
WITH RECURSIVE node_rec AS
(
(SELECT 1 AS depth, * FROM nodes WHERE parent IS NULL LIMIT 10)
UNION ALL
SELECT depth + 1, n.*
FROM nodes AS n JOIN node_rec ON (n.parent = node_rec.node)
WHERE depth < 4
)
SELECT * FROM node_rec;
이것은 훌륭하게 작동하며 다음 결과를 제공합니다.
depth | node | parent
-------+------+--------
1 | 1 |
1 | 2 |
1 | 3 |
1 | 4 |
2 | 5 | 1
2 | 6 | 1
2 | 7 | 1
2 | 8 | 1
2 | 10 | 1
2 | 15 | 3
2 | 16 | 3
2 | 17 | 3
3 | 9 | 6
3 | 11 | 6
3 | 13 | 6
3 | 14 | 6
3 | 18 | 15
4 | 12 | 9
알다시피, ORDER BY
절이 없으므로 순서가 정의되지 않았습니다. 여기서 보는 순서는 루트 노드에서 더 깊은 노드까지입니다.
아래 예제 그림에서 볼 수 있듯이 확장 된 트리보기에 표시되는 결과를 어떻게 주문합니까?
기본적으로 자식 노드가 해당 부모 노드 바로 뒤에 배치되기를 원합니다. 두 개 이상의 자식 노드에 동일한 부모 노드가 있으면 타임 스탬프별로 정렬하고 싶습니다. 위의 예를 바탕으로 달성하려는 원하는 출력 순서는 다음과 같습니다.
depth | node | parent | ts
-------+------+--------+---------
1 | 1 | | 2014-01-01 00:00:00
2 | 5 | 1 | 2014-01-01 00:10:00
2 | 6 | 1 | 2014-01-01 00:20:00
3 | 9 | 6 | 2014-01-01 00:25:00
4 | 12 | 9 | 2014-01-01 00:27:00
3 | 11 | 6 | 2014-01-01 00:26:00
3 | 13 | 6 | 2014-01-01 00:30:00
3 | 14 | 6 | 2014-01-01 00:36:00
2 | 7 | 1 | 2014-01-01 00:21:00
2 | 8 | 1 | 2014-01-01 00:22:00
2 | 10 | 1 | 2014-01-01 00:23:00
1 | 2 | | 2014-01-01 00:08:00
1 | 3 | | 2014-01-01 00:09:00
2 | 15 | 3 | 2014-01-01 10:00:00
3 | 18 | 15 | 2014-01-01 11:05:00
2 | 16 | 3 | 2014-01-01 11:00:00
2 | 17 | 3 | 2014-01-01 12:00:00
1 | 4 | | 2014-01-01 00:10:00
@sorin, 이것이 실제 오래된 게시물이라는 것을 알고 있지만 Google 에서이 게시물을 우연히 발견하여 귀하의 질문에 대답 할 것이라고 생각했습니다. 깊이는 첫 번째 쿼리에서 리터럴 '1'의 별칭에서 비롯됩니다.
—
Sam
depth
칼럼이 나온다는 것을 설명 할 수 있습니까 ? 초기 테이블 구조에는 표시되지 않습니다.