문제
id parent_id
1 0
2 0
3 2
4 0
5 1
6 0
상위 행 (parent_id = 0)과 그 어린이 행을 반환하는 쿼리가 필요합니다.
첫부모
첫부모의 모든 자녀
두 번째 부모
두 번째 부모의 모든 자녀
세 번째 부모
네 번째 부모
예상 결과 : ID에 의해 주문
id parent_id
1 0 (첫 번째 부모)
5 1 (첫 번째 부모의 모든 자녀)
2 Second Parent
3 2 (두 번째 부모의 모든 자녀)
4 0 세 번째 부모
6 0 네 번째 부모
나는 부모의 연합과 모든 자녀를 사용할 수 있지만 부모님을 먼저 자녀에게 제공합니다. 부모님과 즉시 자녀가 필요합니다.
누구든지 도울 수 있습니까?
해결책
이를 위해 재귀 CTE를 사용합니다.
WITH r AS
(SELECT id,
NULL AS parent_id,
CAST(right('000' + CAST(row_number()
OVER (table.id) AS varchar), 3) AS varchar(50))
FROM table WHERE parent IS NULL
UNION ALL
SELECT table.id, table.parent_id,
CAST(r.ord + right('000' + CAST(row_number()
OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
FROM r JOIN table
ON table.parent = r.id)
SELECT id
FROM r
ORDER BY left(ord + '000000000000000000000000000000000', 36)
이 특정 버전은 ID가 999보다 큰 값을 갖는 경우 중단되며 12 개 이상의 레벨이 있으면 중단됩니다. 이것이 당신에게 관심이 있다면, 당신은 다양한 장소에서 0을 조정해야합니다.
더 나은 방법이있을 수 있지만이 방법은 작동합니다.
다른 팁
다음은 주문별로 주문한 Union을 사용하는 예제 솔루션입니다 (심도있는 둥지에는 효과가 없습니다).
SELECT p.id,
p.parent_id,
p.name,
p.id AS sequence
FROM topics AS p
WHERE p.parent_id = 0
UNION
SELECT t.id,
t.parent_id,
t.name,
t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name
내가 아는 한, 당신이 저장하는 모든 것이 상위 ID라면 단일 SQL 문으로 이것을 할 수 없습니다. 데이터 트리를 빠르게 검색 해야하는 경우 선주문 트래버스를 저장하는 것을 고려해야합니다. 소리보다 쉽고 여기에 잘 설명되어 있습니다. http://articles.sitepoint.com/article/hierarchical-data-database