一个不太理解的执行计划

[复制链接]
查看11 | 回复6 | 2011-1-4 10:37:10 | 显示全部楼层 |阅读模式
WANGZK>select * from a;
IDID2 NAME
---------- ---------- --------------------
1
1 wangzk
2
2 cheny
1
2 wangy
2
1 hlj
WANGZK>select * from b;
IDID2 ADDR
---------- ---------- --------------------
1
1 hlj
2
1 cd
WANGZK>select * from a where a.id in(select id from b) and a.id2 in(select id2 from b);
IDID2 NAME
---------- ---------- --------------------
1
1 wangzk
2
1 hlj
执行计划
----------------------------------------------------------
Plan hash value: 2830003574
----------------------------------------------------------------------------
| Id| Operation | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT|| 4 | 256 |10(10)| 00:00:01 |
|*1 |HASH JOIN SEMI || 4 | 256 |10(10)| 00:00:01 |
|*2 | HASH JOIN SEMI|| 4 | 204 | 7(15)| 00:00:01 |
| 3 |TABLE ACCESS FULL| A| 4 | 152 | 3 (0)| 00:00:01 |
| 4 |TABLE ACCESS FULL| B| 2 |26 | 3 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | B| 2 |26 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."ID"="ID")
2 - access("A"."ID2"="ID2")

我不解的原因是这句SQL为什么跑出了正确的执行计划,
select * from a where a.id in(select id from b) and a.id2 in(select id2 from b);
这句SQL应该是错误的,我的目的就是想要验证这个SQL的错误性。因为A表的ID绝对都在B表里,A表的ID2字段也绝对在B表里有。
我感觉这个SQL应该是有问题的啊,也就是说我认为这个SQL跑出的结果应该是A表的全部记录。他偏偏跑出的是A表ID和B表ID and A表ID2和B表ID2字段关联上的记录(按照执行计划确实是这种结果)。可是为什么会这样?或者谁可以告诉我这个SQL是否有潜在的问题,能否测试出来哪?
回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层
SQL有啥问题?
对的啊。
回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层
错误的话只有logical,提交给ORACLE的sql,除非语法错误,否则oracle认为是ok的。
回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层

其实和如下的语句是完全等效的, 没有问题!
select * from a where a.id in(select b.id from b) and a.id2 in(select b.id2 from b);


回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层
语句正确的,没有错。
回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层
lz的语句把and改成or才会有你预想的那个结果。b表里id2字段没等于2的。
回复

使用道具 举报

千问 | 2011-1-4 10:37:10 | 显示全部楼层
b里面再加一个3,2的数据试试
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行