SQL server 2000:数据表的记录结构优化,似乎和 树有关! (200分)

  • 主题发起人 主题发起人 shadow_x
  • 开始时间 开始时间
S

shadow_x

Unregistered / Unconfirmed
GUEST, unregistred user!
这样的记录:
F1 F2 F3 ... Fn OldID
-----------------------
体育与健康 NULL NULL .. NULL 100
体育与健康 健康 NULL .. NULL 756
体育与健康 健康 运动参与 .. NULL 160
... ... ... ... ... .. ...

转换成下面的形式:
NodeName NodeID ParentID Path
体育与健康 5 0 0>
健康 14 5 0>5>
运动参与 78 14 0>5>14>

也就是抛弃原来的结构冗余。重建一颗“学科知识点”的树!
我现在思路是有了。
但是我不知道如何递归的查询每条记录的[red]第一个为NULL[/red]的
字段[green]之前[/green]的字段的内容(树的子节点)

好像要用到SQL递归查询技术

 
有了NodeID和ParentID,还需要Path干什么?

查询的时候不需要全部取出,第一次之需要取出ParentID = 0的记录,随后根据用户的选择
取出ParentID = <用户所选结点ID>的记录就行了。
 
对亚,不需要全部取出的
如果全部取出,太费时间了,也不一定用得到
用到什么,取出什么就行了
 
问题可能没描述清楚!

NodeId,ParentID 是在原表中没有的,需要在新表中生成!!!!
Path+NodeId是为了可以在访问时解析出全部路径。便于查询访问

我的最终问题是如何从数据库表(未转换)中读出记录,
然后生成NodeId,ParentID ,Path
最终得到新的表结构!!!!

呵呵! 200 大洋会想两位想的如此简单?????
 
同意Adnil的看法,如果你已经把结构转换了,就可以直接使用。
你是在问怎样转换吗?。。
 
转换的话也不困难啊,不用递归,稍微笨一点的方法

select * from oldtable
create cursor
while not cursor.eof do
getrecord
for i = 1 to n //轮循字段
select id = NodeID from newtable where Nodename = currecord("f"n) //看Newtable中有没有记录
if id = null then //没有
insert into newtable(NodeName) values(currecord("f"n))
else if i > 1
select id = NodeID from newtable where Nodename = currecord("f"(n-1)) //前一个字段的ID
update newtable set ParentID = id
end if
end for
end while
close cursor

方法笨一点,但是一次走完
 
>》如果你已经把结构转换了
我就是没有转换啊!
我就是不知道如何去转换!!!!

也就是说:我有源 ,我知道目标,但不知道如何去做!
 
Adnil 老大:

我现在开始有一点懂你的意思了,不过上面的那段语句应该是不可执行的!
可不可以给俺[;)]直接写个可执行的语句??[;)]

新表(NodeTable)的结构:
NodeId int
NodeName nvarchar(200)
ParentID int
path varchar(200)
-----------------
原表(T1...T19)19 个学科
F1~F5 或者F1~F6 或者F1~F7 都是nvarchar(100) (每个学科的知识层次不一样)
 
上面的只是伪语言,你对Delphi熟的话,可以用Delphi写,对SQL熟的话,
可以创建一个存储过程来写,都不会太麻烦的,很抱歉我没有时间来帮你写,只能告诉你一些思想了。
 
各位:上面Adnil兄的算法我想是可行的。
但是,上面的伪代码不管是换成delphi 还是换成 sql 都是很难的(我不会)
换成delphi 的难处是对数据的查询,更新,插入的操作!而sql是很容易的
换成sql 得难处则是字段的[red]轮循[/red],而delphi 很容易!

唉!这个对俺来说的确很难! 只想这样了,如果哪位帮我写成可以运行的代码
(sql,delphi都行),我另外给他200!这个帖子的分就给Adnil了,没意见吧!!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
951
SUNSTONE的Delphi笔记
S
后退
顶部