有一表test,这里只列出用到的字段名及数据:
id       code       parent_id
369 02
38823 0201        369
3856 0202        369
4302 020201      3856
10387 020202      3856
4303 020203      3856现要求写一条SQL语句,更新parent_id字段,其中字段code编码规则是两位字符为一单元,表示上下级关系,如0201是02开关,所以他是02的下级,parent_id就是id为369的记录,如果找不到上级,则parent_id不用管。请问怎么写这条SQL语句???

解决方案 »

  1.   


    update A set parent_id= (select id from Test where code=left(A.code,len(A.code)-2))
    from Test A
      

  2.   

    DECLARE @tb TABLE([id] int, [code] varchar(10), [parent_id] int)
    INSERT INTO @tb
        SELECT  369, '02', NULL
        UNION ALL SELECT 38823, '0201', 369
        UNION ALL SELECT 3856, '0202', 369
        UNION ALL SELECT 4302, '020201', 3856
        UNION ALL SELECT 10387, '020202', 3856
        UNION ALL SELECT 4303, '020203', 3856UPDATE T
    SET parent_id = (SELECT TOP 1 [ID] FROM @tb WHERE CODE = LEFT(T.CODE, LEN(T.CODE) - 2))
    FROM @tb TSELECT * FROM @tb
      

  3.   

    借用楼上表
    DECLARE @tb TABLE([id] int, [code] varchar(10), [parent_id] int)
    INSERT INTO @tb
        SELECT  369, '02', NULL
        UNION ALL SELECT 38823, '0201', 369
        UNION ALL SELECT 3856, '0202', 369
        UNION ALL SELECT 4302, '020201', 3856
        UNION ALL SELECT 10387, '020202', 3856
        UNION ALL SELECT 4303, '020203', 3856UPDATE T
    SET parent_id = isnull((SELECT id FROM @tb WHERE CODE = LEFT(T.CODE, LEN(T.CODE) - 2)),parent_id)
    --如id是只唯一的不用加top都可以,加上isnull,如果没有上级就不更新
    FROM @tb T
    SELECT * FROM @tb
      

  4.   

    DECLARE @tb TABLE([id] int, [code] varchar(10), [parent_id] int)
    INSERT INTO @tb
        SELECT  369, '02', NULL
        UNION ALL SELECT 38823, '0201', 369
        UNION ALL SELECT 3856, '0202', 369
        UNION ALL SELECT 4302, '020201', 3856
        UNION ALL SELECT 10387, '020202', 3856
        UNION ALL SELECT 4303, '020203', 3856update a
    set parent_id=b.id
    from @tb a inner join @tb b on left(a.code,len(a.code)-2)=b.code
    select * from @tb
      

  5.   

    create table tb
    (
    id        int,
    code      char(6),
    parent_id int
    )
    insert into tb(id,code,parent_id) values(369  ,'02'    ,null)
    insert into tb(id,code,parent_id) values(38823,'0201'  ,null)
    insert into tb(id,code,parent_id) values(3856 ,'0202'  ,null)
    insert into tb(id,code,parent_id) values(4302 ,'020201',null)
    insert into tb(id,code,parent_id) values(10387,'020202',null)
    insert into tb(id,code,parent_id) values(4303 ,'020203',null)
    goselect * from tbupdate tb
    set parent_id = (select id as parent_id from tb where code=left(a.code,len(a.code)-2)) 
    from tb aselect * from tbdrop table tb--原始值
    id          code   parent_id   
    ----------- ------ ----------- 
    369         02     NULL
    38823       0201   NULL
    3856        0202   NULL
    4302        020201 NULL
    10387       020202 NULL
    4303        020203 NULL--UPDATE后的值
    id          code   parent_id   
    ----------- ------ ----------- 
    369         02     NULL
    38823       0201   369
    3856        0202   369
    4302        020201 3856
    10387       020202 3856
    4303        020203 3856
      

  6.   

    不好意思,接着再问一下,如果再加一字段isEnd,如果没有下级,也可以说是树叶,就是主键没有被做为parent_id引用,语句怎么写?如果没有下级则1,有则0。
      

  7.   

    update Test set isEnd =nullupdate Test set isEnd=1 where id not in (select parent_id from Test  where parent_id is not null)update Test set isEnd =0 where isEnd is null
      

  8.   

    厉害,如果接第一个要求,条件一样,表数据如下:
     id      code      name    parent    descr
    369 02 基础资料 NULL 基础资料
    38823 0201 住户资料 369 基础资料->住户资料
    3856 0202 房产资料 369 基础资料->房产资料
    4302 020201 管理区 3856 基础资料->房产资料->管理区
    10387 020202 楼宇 3856 基础资料->房产资料->楼宇
    4303 020203 房屋 3856 基础资料->房产资料->房屋其中,name字段的值也是知道的,需要更新descr的值,要求是显示出路径描述,应该怎么写,谢谢!我会给你再加分的!
      

  9.   

    update A set descr = (select case when descr is null then menutext else descr + '->' + A.menutext end from test where menucode = left(A.menucode,len(A.menucode)-2))
    from test A
    这样写不对吗?