2017-01-17 4 views
0

나는 그렇게SQL 재귀 ID 노드

Id  Desc  Node 
--------------------- 
1  A 
2  Aa  1 
3  Ab  1 
4  B 
5  Bb  4 
6  Bb1  5 

Desc 값은 사용자가 Bb을 선택한다면, 나는 ID 5 또한 먹으 렴 ID 4 becuase를 원하는 사용자에게 목록보기에 표시됩니다 같은 테이블 구조를 가지고 해당 항목의 루트 노드, 시뮬 해당 사용자가 Bb1을 선택하는 경우, 내가 한 수준 위로 쿼리에만 수 있어요,하지만 n 수준이있을 수 ID 6, 54

필요 순간 나의 질의는

SELECT Id 
FROM tbl 
WHERE Desc = 'Bb1' 
    OR Id = (SELECT Node FROM tbl WHERE Desc = 'Bb1'); 
+2

[트리 구조의 모든 구성원을 찾기]의 사용 가능한 복제 (http://stackoverflow.com/questions 될 것입니다/40631222/find-all-in-a-tree-structure) –

+0

가능한 복제본 : [SQL Server : 자체 참조 테이블에 부모 ID가있는 모든 하위 레코드를 얻는 방법] (http://stackoverflow.com/ 질문/1686340/sql-server-how-to-all-child-records-given-a-parent-id-in-self-referencing) –

+0

이 솔루션을 모두 선택하면 루트 노드, 나는 그것을 원한다. ther 주위에, 나는 부모 노드를 때 자식 노드를 선택 – Markus

답변

0

처럼 보이는, 그래서 당신은 재귀 CTE 사용하여이 작업을 수행 할 수와 같은 스키마

아래 :

CREATE TABLE #TAB (ID INT, DESCS VARCHAR(10), NODE INT) 

INSERT INTO #TAB 
SELECT 1 AS ID, 'A' DESCS, NULL NODE 
UNION ALL 
SELECT 2 , 'AA', 1 
UNION ALL 
SELECT 3, 'AB', 1 
UNION ALL 
SELECT 4, 'B', NULL 
UNION ALL 
SELECT 5, 'BB', 4 
UNION ALL 
SELECT 6, 'BB1', 5 

지금 노드 값을 따기 위해 재귀 CTE을하고 그것을 적용 #TAB에 다시 가입하세요.

;WITH CTE AS(
SELECT ID, DESCS, NODE FROM #TAB WHERE ID=6 
UNION ALL 
SELECT T.ID, T.DESCS, T.NODE FROM #TAB T 
INNER JOIN CTE C ON T.ID = C.NODE 
) 
SELECT * FROM CTE 

당신이 CTE의 첫 번째 쿼리에 6을 통과하면, 결과는

+----+-------+------+ 
| ID | DESCS | NODE | 
+----+-------+------+ 
| 6 | BB1 | 5 | 
| 5 | BB | 4 | 
| 4 | B  | NULL | 
+----+-------+------+