本帖最后由 DJQTDJ 于 2015-7-15 11:23 编辑
下面三个SQL文
SQL:A---------------------------------------------------
DELETE FROM ZW230 A WHERE EXISTS(SELECT * FROM ZW230IF01 B WHERE A.NOKM=B.NOKM AND A.SEQ129=B.SEQ129 AND B.CDKH='D');
SQL:B---------------------------------------------------
DELETE FROM ZW230 A WHERE EXISTS(SELECT '*' FROM ZW230IF01 B WHERE A.NOKM=B.NOKM AND A.SEQ129=B.SEQ129 AND B.CDKH='D');
SQL:C---------------------------------------------------
DELETE FROM ZW230 A WHERE EXISTS(SELECT COUNT(1) FROM ZW230IF01 B WHERE A.NOKM=B.NOKM AND A.SEQ129=B.SEQ129 AND B.CDKH='D');
-------------------------------------------------------
结果:
A删除的是匹配条件的数据
B执行PKG报错
C删除的是表里面的全部数据
为什么会这样,请大神解答一下
select count(*) from ....
总会返回一行记录,所以第三个会全部删除
改成下面这样就等价了
DELETE FROM ZW230 A WHERE 0EXPLAIN PLAN FOR
2 DELETEFROM ZW230 A
3 WHERE EXISTS( SELECTCOUN ...
没有考虑到count聚合函数没有符合的也会返回, 还是楼上的仔细啊, 但是通过执行计划, 可以看到第三个语句没有filter是对表进行FTS进行delete, 因此第三个语句问题已经解决, 那为何第二个语句会不等效呢?