2016-11-08 2 views
0

Я использую SQL Server.T-Sql поиск по иерархии

У меня есть таблица групп с двумя целыми столбцами:

MEGR_KEY 
MEGR_KEY1 

MEGR_KEY является первичным ключом группы. Каждая группа может иметь подгруппы.

К примеру - у меня есть группа 1195:

MEGR_KEY = 1195

Есть подгруппы 1195:

MEGR_KEY = 9484  
MEGR_KEY1 = 1195 

и

MEGR_KEY = 7494 
MEGR_KEY1 = 1195 

В основном MEGR_KEY1 говорит, какая группа является родителем.

Проблема у меня есть, как найти все MEGR_KEY подгруппы иерархически, учитывая только имя корневой группы? Скажем, из предыдущего примера существует 1195 корневая группа. Уже есть две подгруппы: 7494 и 9484. Теперь эти две подгруппы также могут быть родительскими группами для некоторых других групп. Итак, мне нужно найти строки, где MEGR_KEY1 = 7494 ИЛИ MEGR_KEY1 = 9484. Как найти все подгруппы, если задан номер группы (MEGR_KEY)? У меня проблема с написанием запроса для этого.

+1

Берут взглянуть на рекурсивные самосоединения – rbr94

ответ

2

В вашем случае позволяет построить схему,

CREATE TABLE #TAB (MEGR_KEY INT, NAME VARCHAR(50), MEGR_KEY1 INT) 

    INSERT INTO #TAB 
    SELECT 19 , 'Name1' , 0 
    UNION ALL 
    SELECT 20 ,'Name2' , 19 
    UNION ALL 
    SELECT 21 , 'Name3' , 20 
    UNION ALL 
    SELECT 22 , 'Name4' , 21 
    UNION ALL 
    SELECT 23 , 'Name5' , 21 
    UNION ALL 
    SELECT 26 , 'Name6' , 19 
    UNION ALL 
    SELECT 28 , 'Name7' , 0 
    UNION ALL 
    SELECT 29 , 'Name7' , 18 
    UNION ALL 
    SELECT 30 , 'Name8' , 18 

Теперь запрос таблицы (я взял КТР рекурсивно)

DECLARE @MEGR_KEY INT=19; 

    ;WITH CTE AS(
    SELECT * FROM #TAB WHERE MEGR_KEY= @MEGR_KEY 
    UNION ALL 
    SELECT T.* FROM #TAB T 
    INNER JOIN CTE C ON T.MEGR_KEY1 = C.MEGR_KEY 
    ) 
    SELECT * FROM CTE 

И результат будет

enter image description here

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