6万多条数据,删除符合条件,并上下衔接(高难度,附代码,高手指教一、二)
每个人下面左、右两边衔接了2个人,分别为LeftNumber、RightNumber。程爆炸性增长。现在整个网络里有一些人不符合条件ispayok=0,必须删除。HyParentNumber就是LeftNumber、RightNumber的接点人,程三角形式显示。
SQL 总数据达到6万5千条,需要吧不符合条件的删除,而且要吧整个网络衔接起来。现在无法删除,进度条到达38%的时候,差不多一个小时不动了。
那位高手能帮忙看看吗?感激不尽............
<%
set HyExcelRs=nothing
set HyExcelRs=server.CreateObject( "adodb.recordset ")
sql = "SELECT HyID,HyNumber,LeftNumber,RightNumber FROM HyClub where ispayok=0 order by ID "
HyExcelRs.Open sql,conn,1,1
if HyExcelRs.RecordCount> 0 then
while (not HyExcelRs.eof)
HyNumber=HyExcelRs( "HyNumber ")
LeftNumber=HyExcelRs( "LeftNumber ")
RightNumber=HyExcelRs( "RightNumber ")
HyID=HyExcelRs( "HyID ")
if LeftNumber= "0 " or RightNumber= "0 " then
ChildNumber= "0 "
if LeftNumber <> "0 " then
ChildNumber=LeftNumber
end if
if RightNumber <> "0 " then
ChildNumber=RightNumber
end if
set Temprs=nothing
set Temprs=server.CreateObject( "adodb.recordset ")
sql = "select * from hyClub where HyNumber in (select HyParentNumber from hyClub where Hyid = " & HyID & ") "
Temprs.Open sql,conn
kk=Temprs.recordcount
if kk> 0 then
ParentID=Temprs( "ID ")
ParentNumber=Temprs( "HyNumber ")
if Temprs( "LeftNumber ")=HyNumber then
strsql= "update HyClub set LeftNumber= ' "&ChildNumber& " ' where ID= " & ParentID
else
strsql= "update HyClub set RightNumber= ' "&ChildNumber& " ' where ID= " & ParentID
end if
set rs1=server.CreateObject( "adodb.recordset ")
response.write strsql& " <br> "
rs1.Open strsql,conn
strsql= "update HyClub set HyParentNumber= ' "&ParentNumber& " ' where HyNumber= ' " & ChildNumber & " ' "
set rs1=nothing
set rs1=server.CreateObject( "adodb.recordset ")
rs1.Open strsql,conn
'response.write strsql& " <br> "
end if
set rs=nothing
set rs=server.CreateObject( "adodb.recordset ")
sql = "delete from hy where id = " & HyID
rs.Open sql,conn
set rs=nothing
set rs=server.CreateObject( "adodb.recordset ")
sql = "delete from hyClub where Hyid = " & HyID
rs.Open sql,conn
end if
HyExcelRs.movenext
wend
end if
%>
[解决办法]
把我的思路写一下
如果是在sql server中折腾的话
1。声名游标1,用于检索不符合条件的行where ispayok=0
2。打开游标对每一条记录进行处理
while fetch_status=0
begin
如果存在左右
end
[解决办法]
不好意思,上面的帖子是发错了
还是设计一个函数吧
嵌套删除
[解决办法]
"select * from hyClub where HyNumber in (select HyParentNumber from hyClub where Hyid = " & HyID & ") "
这种写法运算量极大! 绝对不要用 in
[解决办法]
实现这样的功能并不复杂,关键是你设计这个会员管理系统的时候是如何设计的
上周才交了一个项目,也是做的这种会员管理系统,我们是做成树状形式的,删除后自动排列到前面即可。
[解决办法]
首先
程序死在那里,很可能有死循环(认了爷爷做儿子),很差的机子 几万条数据是不用一分钟的。
那你还得想法搞定这死循环,再删,
由上往下删是最快的,不过要接上个数组,或数据库,边记边删。(还有,你的机太老土,内存不大勿试)
看
A
/ \
AA AB
/ \ / \
AAA AAB ABA ABB
查 AA 死了, 好,记下AA AAA AAB
...............
一次以后,记下不少死掉的了,
再来一次,左边的补上,左边的也死了,右边的补上,右边的也死了,下下级。
牛吹大了,前面是对的,后面我扯远了,呵呵.............
[解决办法]
删除了HyParentNumber以后,他的下属节点归谁呢?这个需要先解决啊.以前一个项目我也用类似的结构模拟文件系统.我的思路是将所有纪录度到一二维数组或自定义结构数组中,然后通过递归找出需要删除的纪录id并保存到一字符串中(格式为:id1,id2,id3...).最后执行sql delete from <tablename> where id in ( " & stridsum & ") ".这种递归结构直接用数据库可能不行,会把数据库累死的.