2016-10-10 4 views
4

Нужна помощь по SQL циклов, в запросеMS SQL Временные таблицы зацикливание

мой стол:

enter image description here

мой ожидает выход:

enter image description here

Я могу для получения только 1 строки.

declare @ID nvarchar(50) = (select EMP_ID from HRS_WORKFLOW01); 


    CREATE TABLE #TEMP(EMP_ID NVARCHAR(200),EMP_L1 NVARCHAR(200),EMP_L2 NVARCHAR(200),EMP_L3 NVARCHAR(200),EMP_L4 NVARCHAR(200)) 
    DECLARE @L1 NVARCHAR(50); 
    DECLARE @L2 NVARCHAR(50); 
    DECLARE @L3 NVARCHAR(50); 
    DECLARE @L4 NVARCHAR(50); 

    SET @L1 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID [email protected]) 
    INSERT INTO #TEMP (EMP_ID,EMP_L1)VALUES(@ID,@L1) 

    SET @L2 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID [email protected]) 
    UPDATE #TEMP SET [email protected] WHERE [email protected] 

    SET @L3 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID [email protected]) 
    UPDATE #TEMP SET [email protected] WHERE [email protected] 

    SET @L4 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID [email protected]) 
    UPDATE #TEMP SET [email protected] WHERE [email protected] 

    SELECT * FROM #TEMP 
+1

Вы читали учебник CTE (Common Table Expression)? – qxg

+0

Пожалуйста, разместите образцы данных в текстовом формате вместо изображений –

ответ

3

Вы должны использовать Recursive CTE

;WITH DATA 
    AS (SELECT * 
     FROM (VALUES ('ALI','ABU'), 
         ('JOSH','LIM'), 
         ('JAMES','KAREN'), 
         ('LIM','JERRY'), 
         ('JERRY','GEM')) TC(EMP_ID, EMP_L1)), 
    REC_CTE 
    AS (SELECT EMP_ID, 
       EMP_L1, 
       Cast(EMP_L1 AS VARCHAR(8000)) AS PARENT, 
       LEVEL = 1 
     FROM DATA 
     UNION ALL 
     SELECT D.EMP_ID, 
       D.EMP_L1, 
       Cast(RC.PARENT + '.' + D.EMP_L1 AS VARCHAR(8000)), 
       LEVEL = LEVEL + 1 
     FROM DATA D 
       JOIN REC_CTE RC 
        ON RC.EMP_ID = D.EMP_L1) 
SELECT TOP 1 WITH TIES EMP_ID, 
         EMP_L1 = COALESCE(Parsename(PARENT, 1), ''), 
         EMP_L2 = COALESCE(Parsename(PARENT, 2), ''), 
         EMP_L3 = COALESCE(Parsename(PARENT, 3), ''), 
         EMP_L4 = COALESCE(Parsename(PARENT, 4), '') 
FROM REC_CTE 
ORDER BY Row_number()OVER(PARTITION BY EMP_ID ORDER BY LEVEL DESC) 
OPTION (MAXRECURSION 0) 

Результат:

╔════════╦════════╦════════╦════════╦════════╗ 
║ EMP_ID ║ EMP_L1 ║ EMP_L2 ║ EMP_L3 ║ EMP_L4 ║ 
╠════════╬════════╬════════╬════════╬════════╣ 
║ ALI ║ ABU ║  ║  ║  ║ 
║ JAMES ║ KAREN ║  ║  ║  ║ 
║ JERRY ║ GEM ║  ║  ║  ║ 
║ JOSH ║ LIM ║ JERRY ║ GEM ║  ║ 
║ LIM ║ JERRY ║ GEM ║  ║  ║ 
╚════════╩════════╩════════╩════════╩════════╝ 

Примечание: Это считает может быть максимум 4 уровней. Чтобы разделить данные на разные столбцы, я использовал функцию PARSENAME, которая не будет работать, если вы превысите 4 уровня.

Если вы не хотите разделить родителей на разные столбцы, удалите PARSENAME и выберите одну колонку PARENT.

+0

, если я буду вас дважды! Один для recurssion и другой для Top 1 WITH TIES. – Esty

+0

привет, но моя таблица имеет тысячи emp_id ... – KyLim

+0

@KyLim - у вас может быть любое количество 'emp_id', это не проблема, если она всегда' EMP_L1' на 'EMP_L4' –

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