문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top