2016-12-09 7 views
0

У меня есть таблица, как указано ниже. Название стола parentChildTableЗапрос Чтобы получить все дочерние и дочерние дочерние элементы заданного корня

  ------------------------------------ 
     | ID  | Description |Parent ID| 
     ------------------------------------- 
     | 1101  | Root  | ''  | 
     | 1102  | Child of 1101| 1101 | 
     | 1105  | Child of 1101| 1101 | 
     | 1103  | Child of 1102| 1102 | 
     | 1104  | Child of 1102| 1102 | 
     | 1178  | Child of 1105| 1105 | 
     | 11440 | Child of 1105| 1105 | 
     | 11567 | Childof 11440| 11440 | 
     | 12904Y | Child of11567| 11567 | 
     | 125687 | Child of 1101| 1101 | 

теперь с 1101 -> корня в качестве параметра мне нужен ее ребенок и суб Чайлдс до уровня не ребенка (я имею в виду до листьев)

вывода должен быть, как этот

 ------------ 
     | ID  | 
     ------------- 
     | 1102  | 
     | 1105  | 
     | 1103  | 
     | 1104  | 
     | 1178  | 
     | 11440 | 
     | 11567 | 
     | 12904Y | 
     | 125687 | 

благодарит заранее.

+0

Что вы уже пробовали и то, что проблема (ы) вы испытывали? – 3N1GM4

+0

Я попытался использовать union all в одной таблице, но запрос, который я попытался сделать большим для каждого уровня с корнем как параметр @ 3N1GM4 –

+0

Было бы полезно обновить ваш вопрос с подробностями того, что вы уже пытались показать людям, что у вас есть вложите немного усилий в это самостоятельно и не просто ищете, чтобы кто-то сделал вашу работу за вас. FWIW, вы можете изучить итеративный подход к детализации «уровней» дочерних записей до тех пор, пока их не будет больше, создайте временную таблицу результатов, а затем верните это. – 3N1GM4

ответ

1
-- Set up test data 
DECLARE @parentChildTable TABLE (
    ID VARCHAR(50), 
    [Description] VARCHAR(50), 
    [Parent ID] VARCHAR(50) 
) 

INSERT INTO @parentChildTable 
SELECT '1101','Root','' 
UNION 
SELECT '1102','Child of 1101','1101' 
UNION 
SELECT '1105','Child of 1101','1101' 
UNION 
SELECT '1103','Child of 1102','1102' 
UNION 
SELECT '1104','Child of 1102','1102' 
UNION 
SELECT '1178','Child of 1105','1105' 
UNION 
SELECT '11440','Child of 1105','1105' 
UNION 
SELECT '11567','Childof 11440','11440' 
UNION 
SELECT '12904Y','Child of11567','11567' 
UNION 
SELECT '125687','Child of 1101','1101' 

-- Set initial root (could switch this for any valid ID value) 
DECLARE @rootID VARCHAR(50) 
SET @rootID = '1101' 

-- Iterate to find results 
CREATE TABLE #results (
    ID VARCHAR(50), 
    Searched BIT 
) 

DECLARE @currentRoot VARCHAR(50) 
SET @currentRoot = @rootID 

WHILE (@currentRoot IS NOT NULL) 
BEGIN 
    INSERT INTO #results 
    SELECT ID, 0 FROM @parentChildTable WHERE [Parent ID] = @currentRoot 
    UPDATE #results SET Searched = 1 WHERE ID = @currentRoot 
    SELECT @currentRoot = MIN(ID) FROM #results WHERE Searched = 0 
END 

SELECT ID FROM #results 

DROP TABLE #results 

Результаты:

ID 
------ 
1102 
1105 
125687 
1103 
1104 
11440 
1178 
11567 
12904Y 
+0

Я думаю, что это не характерно. предположим, что у нас есть тысячи данных в таблице, значит, наш запрос будет намного больше. –

+0

@AshutoshOjha извините, я не уверен, что вы имеете в виду? Это решение будет работать независимо от количества представленных записей - хотя производительность может быть не очень велика на очень больших наборах данных. – 3N1GM4

+0

Я имею в виду, что запрос будет увеличиваться по мере увеличения количества записей. Нам нужно объединить каждую запись в таблицу –

1
DECLARE @id VARCHAR(100)='1101' 
;WITH tree(ID,Parent_ID)AS(
    SELECT '1101','' UNION 
    SELECT '1102','1101' UNION 
    SELECT '1105','1101' UNION 
    SELECT '1103','1102' UNION 
    SELECT '1104','1102' UNION 
    SELECT '1178','1105' UNION 
    SELECT '11440','1105' UNION 
    SELECT '11567','11440' UNION 
    SELECT '12904Y','11567' UNION 
    SELECT '125687','1101' 
),cte AS(
    SELECT ID FROM tree WHERE [email protected] 
    UNION ALL 
    SELECT t.ID FROM tree AS t INNER JOIN cte AS c ON c.id=t.Parent_ID 
) 
SELECT * FROM cte WHERE [email protected] 
ORDER BY ID 
 
ID 
------ 
1102 
1103 
1104 
1105 
11440 
11567 
1178 
125687 
12904Y 

Смежные вопросы