求救!烦人的查找数据问题!
本人现从事数据整理工作,现有一个表,里面存放的是一个树的数据结构,现在要增加一字段(F_ID)来保存(也就是每个树节点的父节点的ID),如果是根节点F_ID j就为空即可!现举例来说明表的结构:
table 1:
ID DOT F_ID(新加)
A null null 结果:F_ID=null根
A01 null null 结果:F_ID=A
A01B null null 结果:F_ID=A01
A01B 1/00 null null 结果:F_ID=A01B
A01B 1/02 . null 结果:F_ID=A01B 1/00
A01B 1/04 .. null 结果:F_ID=A01B 1/02
A01B 1/06 ... null 结果:F_ID=A01B 1/04
A01B 1/08 .. null 结果:F_ID=A01B 1/02
A01B 1/10 . null 结果:F_ID=A01B 1/00
........
用上面的例子:
ID 中 如果 len(ID)=1 and Dot is null 就为根,
len(ID)=3 and Dot is null;F_ID=A,
len(ID)=4 and Dot is null;F_id=A01,
len(ID)> 4 and Dot is null;F_ID=A01B ,
Dot有点的 点多的是点少的子,点相等的为同级。(可以看我写的结果)
现在数据量很大。需要查找每一条数据的父节点。然后放到F_ID中。
在sql中怎么解决,请大家帮助我,有好的建议也行!
[解决办法]
借用楼上的数据~
-- 创建表
create table table1([ID] varchar(20),DOT varchar(20),F_ID varchar(20))
Go
-- 插入数据
insert table1 select 'A ',null,null
insert table1 select 'A01 ',null,null
insert table1 select 'A01B ',null,null
insert table1 select ID,null,null
insert table1 select 'A01B 1/02 ', '. ',null
insert table1 select 'A01B 1/04 ', '.. ',null
insert table1 select 'A01B 1/06 ', '... ',null
insert table1 select 'A01B 1/08 ', '.. ',null
insert table1 select 'A01B 1/10 ', '. ',null
Go
--查询
select ID,DOT,
(select MAX(ID) FROM table1 WHERE
((M.ID LIKE ID+ '% ') OR (ID LIKE LEFT(M.ID,CHARINDEX( '/ ',M.ID))+ '% '))
AND ISNULL(DOT, ' ')=ISNULL(LEFT(M.DOT,LEN(M.DOT)-1), ' ') AND ID <M.ID
) AS F_ID
from table1 M
ID DOT F_ID
-------------------- -------------------- --------------------
A NULL NULL
A01 NULL A
A01B NULL A01
A01B 1/00 NULL A01B
A01B 1/02 . A01B 1/00
A01B 1/04 .. A01B 1/02
A01B 1/06 ... A01B 1/04
A01B 1/08 .. A01B 1/02
A01B 1/10 . A01B 1/00
(9 行受影响)
[解决办法]
UPDATE table1
SET F_ID=(select MAX(ID) FROM table1 WHERE
((M.ID LIKE ID+ '% ') OR (ID LIKE LEFT(M.ID,CHARINDEX( '/ ',M.ID))+ '% '))
AND ISNULL(DOT, ' ')=ISNULL(LEFT(M.DOT,LEN(M.DOT)-1), ' ') AND ID <M.ID
)
FROM table1 M