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是否有潜在的问题,能否测试出来哪?