Office中国论坛/Access中国论坛

标题: 删除查询运行之比较 [打印本页]

作者: roych    时间: 2011-4-25 14:57
标题: 删除查询运行之比较
本帖最后由 roych 于 2011-4-25 15:13 编辑

现在俺是采用了子查询来删除:
1、DELETE t_SysUserLogon.*
FROM t_SysUserLogon
WHERE Name Not In (select Name from tbl_E_Personal);
2、之前老汉斑竹说,应该用Dlookup来做,我稍稍改了下,用Dcount来做
DELETE  t_SysUserLogon.*
FROM t_SysUserLogon
WHERE DCount("name","tbl_e_personal","name='" & [name] & "'")=0;
经测试对比:
第一种方法运行了46'90;第二种方法运行到1:30'时,俺实在没耐性了,便关掉了已经没反应的数据库。想来第二种方法应该是逐行对比,运行了27000*714次所致的吧。
本想用右联接来做,但无法执行(见下面代码),看看大家有没有其它更好的办法?
DELETE t_SysUserLogon.*
FROM tbl_E_Personal RIGHT JOIN t_SysUserLogon ON tbl_E_Personal.Name = t_SysUserLogon.Name
WHERE tbl_E_Personal.Name Is Null

作者: todaynew    时间: 2011-4-25 15:37
本帖最后由 todaynew 于 2011-4-25 15:39 编辑

域函数,子查询应该都快不了。其实可以跳出这个思路,另辟蹊径。类似这样的问题,可以绕这样的圈子来处理:
1、联接两表得到有相同name的记录,将这些记录生成到一个临时表中(可用生成表查询执行之)。
2、全部删除目标表中的记录。
3、将临时表的记录追加到目标表。
4、删除临时表

这叫做:穿插迂回辟蹊径,黄泉路上且快行。上吊莫寻一个树,放眼望去是深林。

作者: roych    时间: 2011-4-25 23:42
看样子也只能如此了。。。——微软的MSDN里好像就这么介绍的。
作者: ziwy723    时间: 2011-6-30 21:40
好思路
作者: dorenmi    时间: 2014-12-1 12:44
跳出思路,另辟蹊径!
作者: wuxi0510    时间: 2015-2-25 10:07
{:soso_e179:}{:soso_e179:}{:soso_e179:}
作者: 522650696    时间: 2016-4-26 20:48
高招呀




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3