Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL临时表循环_Sql_Sql Server_Tsql_Hierarchical Data_Recursive Query - Fatal编程技术网

MS SQL临时表循环

MS SQL临时表循环,sql,sql-server,tsql,hierarchical-data,recursive-query,Sql,Sql Server,Tsql,Hierarchical Data,Recursive Query,需要有关sql循环查询的帮助吗 我的桌子: ╔════════╦════════╦════════╦════════╦════════╗ ║ EMP_ID ║ EMP_L1 ║ EMP_L2 ║ EMP_L3 ║ EMP_L4 ║ ╠════════╬════════╬════════╬════════╬════════╣ ║ ALI ║ ABU ║ ║ ║ ║ ║ JAMES ║ KAREN ║ ║ ║

需要有关sql循环查询的帮助吗

我的桌子:

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

我的预期输出:

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

我只能得到一条线

 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 =@ID)
    INSERT INTO #TEMP (EMP_ID,EMP_L1)VALUES(@ID,@L1)

    SET @L2 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID =@L1)
    UPDATE #TEMP SET EMP_L2=@L2 WHERE EMP_ID=@ID

    SET @L3 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID =@L2)
    UPDATE #TEMP SET EMP_L3=@L3 WHERE EMP_ID=@ID

    SET @L4 = (SELECT L1EmplNo FROM HRS_WORKFLOW01 WHERE EMP_ID =@L3)
    UPDATE #TEMP SET EMP_L4=@L4 WHERE EMP_ID=@ID

    SELECT * FROM #TEMP

您需要使用
递归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
列。

您读过CTE(公共表表达式)吗教程?请以文本格式发布示例数据,而不是images@KyLim-您可以拥有任意数量的
emp_id
如果总是
emp_L1
emp_L4
Msg 530,级别16,状态1,过程工作流,第23行语句终止,则不成问题。在语句完成之前,已用尽最大递归100,我收到这个错误xDUSE选项(MAXRECURSION 0);在陈述的结尾。