首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求救!烦人的查找数据有关问题

2012-01-08 
求救!烦人的查找数据问题!本人现从事数据整理工作,现有一个表,里面存放的是一个树的数据结构,现在要增加一

求救!烦人的查找数据问题!
本人现从事数据整理工作,现有一个表,里面存放的是一个树的数据结构,现在要增加一字段(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

热点排行
Bad Request.