DELETE WHERE EXISTS的问题

[复制链接]
查看11 | 回复6 | 2015-8-24 15:25:59 | 显示全部楼层 |阅读模式
本帖最后由 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删除的是表里面的全部数据
为什么会这样,请大神解答一下


回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
3个语句是等效的,你把3个语句的执行计划贴一下分析一下
回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
bell6248 发表于 2015-7-15 11:42
3个语句是等效的,你把3个语句的执行计划贴一下分析一下

第三个不等价吧。。版主。
回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
本帖最后由 DJQTDJ 于 2015-7-15 13:16 编辑
SQL>EXPLAIN PLAN FOR
2 DELETEFROM ZW230 A
3 WHERE EXISTS( SELECT*
4
FROMZW230IF01 B
5
WHERE A.NOKM
=
B.NOKM
6
AND
A.SEQ129
= B.SEQ129
7
AND
B.CDKH
= 'D'
8 );
解析されました。
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Plan hash value: 477166656
-------------------------------------------------------------------------------------------
| Id| Operation
| Name| Rows| Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT
| | 1 | 113 | 4(25)| 00:00:01 |
| 1 |DELETE
| ZW230 | | |
|
|
| 2 | NESTED LOOPS
| | | |
|
|
| 3 |NESTED LOOPS
| | 1 | 113 | 4(25)| 00:00:01 |
| 4 | SORT UNIQUE
| | 1 | 8 | 3 (0)| 00:00:01 |
|*5 |TABLE ACCESS FULL| ZW230IF01 | 1 | 8 | 3 (0)| 00:00:01 |
|*6 | INDEX UNIQUE SCAN | ZW230_SA| 1 | | 0 (0)| 00:00:01 |
| 7 |TABLE ACCESS BY INDEX ROWID| ZW230 | 1 | 105 | 0 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("B"."CDKH"='D')
6 - access("A"."NOKM"="B"."NOKM" AND "A"."SEQ129"="B"."SEQ129")

回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
SQL>EXPLAIN PLAN FOR
2 DELETEFROM ZW230 A
3 WHERE EXISTS( SELECTCOUNT(1)
4
FROMZW230IF01 B
5
WHERE A.NOKM
=
B.NOKM
6
AND
A.SEQ129
= B.SEQ129
7
AND
B.CDKH
= 'D'
8 );
解析されました。
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 932469355
----------------------------------------------------------------------------
| Id| Operation
| Name| Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | DELETE STATEMENT | |60 |6300 | 3 (0)| 00:00:01 |
| 1 |DELETE
| ZW230 | | |
|
|
| 2 | TABLE ACCESS FULL| ZW230 |60 |6300 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
9行が選択されました。
SQL>
回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
select count(*) from ....
总会返回一行记录,所以第三个会全部删除
改成下面这样就等价了
DELETE FROM ZW230 A WHERE 0EXPLAIN PLAN FOR
2 DELETEFROM ZW230 A
3 WHERE EXISTS( SELECTCOUN ...
没有考虑到count聚合函数没有符合的也会返回, 还是楼上的仔细啊, 但是通过执行计划, 可以看到第三个语句没有filter是对表进行FTS进行delete, 因此第三个语句问题已经解决, 那为何第二个语句会不等效呢?
回复

使用道具 举报

千问 | 2015-8-24 15:25:59 | 显示全部楼层
bell6248 发表于 2015-7-15 13:52
没有考虑到count聚合函数没有符合的也会返回, 还是楼上的仔细啊, 但是通过执行计划, 可以看到第三个语 ...

把*改为NULL呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行