有一表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语句???
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语句???
update A set parent_id= (select id from Test where code=left(A.code,len(A.code)-2))
from Test A
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
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
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
(
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
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的值,要求是显示出路径描述,应该怎么写,谢谢!我会给你再加分的!
from test A
这样写不对吗?