ID parentid level level bomid
----------------------------------------------------
487 0 1 + 275
488 487 2  ++ 41
489 488 3   +++ 2098
490 489 4    ++++ 824
491 490 5     +++++ 825
492 491 6      ++++++ 784
493 487 2  ++ 41
494 487 2  ++ 41
495 487 2  ++ 41
496 487 2  ++ 41
497 496 3   +++ 2099
498 497 4    ++++ 823
499 498 5     +++++ 827
500 499 6      ++++++ 785
501 0 1 + 275
502 0 1 + 275根据level将ID填入parentid中,以上是已经填好的
我写了一个只能填一部分id 493-496无法算了update hzkf_xx set parentid=levelno-1 
declare @id nvarchar(20)
declare @parentid nvarchar(20)
declare @levelno int
declare @cid int
declare @level1 int
declare @tlevel int
declare @tparentid int
 
DECLARE BOM CURSOR FOR
select ID,ParentID,levelno
from hzkf_xx
open BOM
FETCH NEXT FROM BOM
into @id,@parentid,@levelnoWHILE @@FETCH_STATUS = 0
BEGIN if (@levelno=1)
begin
set @tparentid=@parentid
set @tlevel=@id
set @cid=@id
set @level1=@levelno
--print @id
end
if (@levelno>1)
begin
if (@levelno>@level1)
begin
update hzkf_xx set parentid=@cid where id=@id
set @cid=@id
set @level1=@levelno
end end
if (@levelno<=@level1)
begin
set @cid=@id
set @level1=@levelno
end
FETCH NEXT FROM BOM
into @id,@parentid,@levelno
ENDCLOSE BOM
DEALLOCATE BOM

解决方案 »

  1.   

    DECLARE @TB TABLE([ID] INT, [parentid] INT, [level] INT, [level2] VARCHAR(6), [bomid] INT)
    INSERT @TB 
    SELECT 487, 0, 1, '+', 275 UNION ALL 
    SELECT 488, 487, 2, '++', 41 UNION ALL 
    SELECT 489, 488, 3, '+++', 2098 UNION ALL 
    SELECT 490, 489, 4, '++++', 824 UNION ALL 
    SELECT 491, 490, 5, '+++++', 825 UNION ALL 
    SELECT 492, 491, 6, '++++++', 784 UNION ALL 
    SELECT 493, 487, 2, '++', 41 UNION ALL 
    SELECT 494, 487, 2, '++', 41 UNION ALL 
    SELECT 495, 487, 2, '++', 41 UNION ALL 
    SELECT 496, 487, 2, '++', 41 UNION ALL 
    SELECT 497, 496, 3, '+++', 2099 UNION ALL 
    SELECT 498, 497, 4, '++++', 823 UNION ALL 
    SELECT 499, 498, 5, '+++++', 827 UNION ALL 
    SELECT 500, 499, 6, '++++++', 785 UNION ALL 
    SELECT 501, 0, 1, '+', 275 UNION ALL 
    SELECT 502, 0, 1, '+', 275
    SELECT ID,
    CASE WHEN [parentid]=0 THEN 0 ELSE (SELECT TOP 1 ID FROM @TB WHERE ID<T.ID AND LEVEL=T.LEVEL-1 ORDER BY ID DESC) END AS PID,
    LEVEL,
    LEVEL2,
    BOMID
    FROM @TB AS T
    /*
    ID          PID         LEVEL       LEVEL2 BOMID
    ----------- ----------- ----------- ------ -----------
    487         0           1           +      275
    488         487         2           ++     41
    489         488         3           +++    2098
    490         489         4           ++++   824
    491         490         5           +++++  825
    492         491         6           ++++++ 784
    493         487         2           ++     41
    494         487         2           ++     41
    495         487         2           ++     41
    496         487         2           ++     41
    497         496         3           +++    2099
    498         497         4           ++++   823
    499         498         5           +++++  827
    500         499         6           ++++++ 785
    501         0           1           +      275
    502         0           1           +      275(16 行受影响)
    */
      

  2.   

    SELECT ID,
    CASE WHEN LEVEL=1 THEN 0 ELSE (SELECT TOP 1 ID FROM @TB WHERE ID<T.ID AND LEVEL=T.LEVEL-1 ORDER BY ID DESC) END AS PID,
    LEVEL,
    LEVEL2,
    BOMID
    FROM @TB AS T
      

  3.   

    SELECT ID,
    PID=ISNULL((SELECT TOP 1 ID FROM tb WHERE ID<T.ID AND LEVEL=t.LEVEL-1 ORDER BY ID DESC),0),
    LEVEL,
    LEVEL2,
    BOMID
    FROM tb t