利用递归删除数据表中的 所有记录(100分)

  • 主题发起人 主题发起人 woshishei
  • 开始时间 开始时间
W

woshishei

Unregistered / Unconfirmed
GUEST, unregistred user!
有 这样一个表【Create Table aaa
(
No1 int,
No2 int
)
Delete From aaa
insert into aaa(No1,No2)
values(0,1)
insert into aaa(No1,No2)
values(1,2)
insert into aaa(No1,No2)
values(1,3)
insert into aaa(No1,No2)
values(1,4)
insert into aaa(No1,No2)
values(1,5)
insert into aaa(No1,No2)
values(1,6)
insert into aaa(No1,No2)
values(2,7)
insert into aaa(No1,No2)
values(2,8)
insert into aaa(No1,No2)
values(2,9)
insert into aaa(No1,No2)
values(2,10)
insert into aaa(No1,No2)
values(7,11)】

我想用[red]递归[/red]的方法删除所有的行 我做了半天做不出来 帮我看看 好吗??先谢谢大虾们了
 
什么意思?你要删除所有的行直接Delete不就可以了吗?
如果你有别的要求,可以用循环来做:
DECLARE lCount int;
DECLARE i int;
SET i = 1;
Select Count(*) From aaa Into lCount; -- 得到记录数
While i < lCount Do
Delete From aaa Where ...;
SET i = i + 1;
End While;
 
谢谢你的回答,可能我没说清楚,其实这个表他就是一棵树;从树的根节点可以找出他的所有子节点例如:0,1-->1,2-->2,7-->7--11
2,8
2,9
2,10
这样下来,并不是删除了整个表,而是只删除了某一个枝的所有子节点:其实我的主要目的并不是要删除整个表,而是想利用[red]递归[/red]的算法来来实现删除某一个节点下的所有子节点的这个功能,不知道我表达清楚没有,你能在帮我看看吗??谢谢
 
给你个最简单方法,把数据扔到前台一个树的控件里面,然后找到你所要删除的节点,判断其hasChild是否为true,如果是,就往下找,去删除,如果不是则ok。
 
非常感谢,你这样只是把数据表中的数据读到控件中了,而且对该控件进行了操作,但是你并没有对数据表中的记录进行操作啊 ,这样导致的结果就是,你再次打开这个应用程序的时候就和刚读取数据到控件中的时候是一样的了呀,恐怕还要浪费你们的时间帮我想想罗[:(][:(]
 
首先,我想说的是你这种设计不大合理
树结构,三要素,id,parentID,index,少一不可唯一确定一节点位置。

像这种树的结构 通常用编码方式,一个字段就可以搞定(字段越多,字段长度大对查询速度很有影响),而且可以很清晰的看出层次结构
01
02 ,0201,020101
0202,
0203
...
这样也不用递归,比如02的所有子节点,很容易啊,select code where code like '02%'
 
就拿你的来举例子:
0,1-->1,2-->2,7-->7--11
0,2-->2,2-->2,7-->7--11
...
7--11这个节点,位置就不能确定,
你怎么能确定7--11是0,1下的子节点,而不会是是0,2等其他节点的呢,你说呢,呵呵
 
转贴一个: sql 递归查询
http://www.delphibbs.com/keylife/iblog_show.asp?xid=30183
 
谢谢 首先你先看看value()中的数据,他是一个一个逐渐增大的(而且这一列始终是不会有相同的数字的),而且括号左边的数字是从括号右边取出来的,也就是说我用程序控制了他,不可能出现n,n或者n,n-1这种情况,也不可能出现两行相同的数据比如(2,7)其实我数据库中的No2列是用的Identity,也就是我的数据表只会出现No1对No2为1对多或者1对1绝不会出现No2对No1为1对多的情况,所以麻烦仁兄在帮我看看 呵呵
 
你用循环删除时加上条件判断不行吗?
 
能具体点吗,谢谢
 
谢谢各位的参与没问题得以完美解决:
数据库:
Create Table TBB
(
iKey int,
iTag int
)

insert into TBB(iKey,iTag)
values(0,1)
insert into TBB(iKey,iTag)
values(1,2)
insert into TBB(iKey,iTag)
values(1,3)
insert into TBB(iKey,iTag)
values(1,4)
insert into TBB(iKey,iTag)
values(1,5)
insert into TBB(iKey,iTag)
values(1,6)
insert into TBB(iKey,iTag)
values(2,7)
insert into TBB(iKey,iTag)
values(2,8)
insert into TBB(iKey,iTag)
values(2,9)
insert into TBB(iKey,iTag)
values(2,10)
insert into TBB(iKey,iTag)
values(7,11)

程序代码:
procedure TForm1.Deleted(AId: integer);
var
QryTmp,QryTmp1:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.Connection := self.ADOConnection1;
QryTmp1:=TADOQuery.Create(self);
QryTmp1.Connection := self.ADOConnection1;
QryTmp.SQL.Add('select * from TBB');
QryTmp.SQL.Add('where Ikey='+inttostr(AId));
QryTmp.SQL.Add(' Order by iTag ');
QryTmp.Open;
while not QryTmp.Eof do
begin
with QryTmp1 do begin
Close;
SQL.Clear;
SQL.Add('Delete From TBB Where iTag = :iTag And iKey = :iKey');
parameters.ParamByName('iTag').Value := QryTmp.fieldByName('iTag').AsString;
parameters.ParamByName('iKey').Value := QryTmp.FieldByName('iKey').AsString;
ExecSQL;
end;
Deleted(QryTmp.fieldbyname('iTag').AsInteger); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;

调用这个函数,就可以实现我所说的功能
谢谢各位 ,祝各位玩得开心
 
CREATE OR REPLACE PROCEDURE USP_DELETETREENODE
(TMPNO NUMBER)
AS
ICOUNT NUMBER;
BEGIN
SELECT COUNT(1) INTO ICOUNT FROM AAA WHERE NO1=TMPNO;
IF ICOUNT=0 THEN
DELETE FROM AAA WHERE NO2=TMPNO;
ELSE
FOR AA IN (SELECT NO2 FROM AAA WHERE NO1=TMPNO) LOOP
USP_DELETETREENODE(AA.NO2);
END LOOP;
END IF;
DELETE FROM AAA WHERE NO1=TMPNO;
COMMIT;
END USP_DELETETREENODE;
/
输入你删除的节点就可以了~
 
谢谢你的回复,我用你的方法试一试,可是没分了哦 我刚才已经给完了[:(][:(][:(]
祝你天天开心
 

Similar threads

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