select * from A inner join B on A.a=B.b inner join C on C.c=A.a
上述请教各位,表C关联的基表是A表 还是A表和B表关联后的表呢?
  求: 不胜感激!!!

解决方案 »

  1.   


    基表是什么意思呢?
    如果单纯从语句上看,是表C关联的是 A表与B表INNER JOIN的结果
    但是
    实际的实行过程中要收到优化器的影响,实际的执行顺序受到很多因素制约:比如结果集的大小、初始化参数中一次执行块的大小、索引建立的列、有无索引、该表的并发程度、是否排序、是否存在唯一键约束等等条件,优化器会综合考虑上面的各种因素,选择合适的执行顺序。也就是说,可能在实际的执行过程中,B和C先做INNER JOIN操作,然后再与A做INNER JOIN操作,也是未可知的,取决于当时的环境。
      

  2.   

    oracle应该安装CBO规则来生成执行计划,数据的存取方式由cbo的执行计划决定
    具体的还要看执行计划,
      

  3.   

    具体情况还是要看执行计划,我的测试环境是只创建了a、b、c三张空表,执行计划如下:
    SQL> set autotrace trace exp;
    SQL> select * from a inner join b on a.a=b.b inner join c on c.c=a.a;执行计划
    ----------------------------------------------------------
    Plan hash value: 4163918451------------------------------------------------------------------------------
    | Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |      |     1 |    36 |     7  (15)| 00:00:01 |
    |*  1 |  HASH JOIN            |      |     1 |    36 |     7  (15)| 00:00:01 |
    |   2 |   MERGE JOIN CARTESIAN|      |     1 |    24 |     4   (0)| 00:00:01 |
    |   3 |    TABLE ACCESS FULL  | B    |     1 |    12 |     2   (0)| 00:00:01 |
    |   4 |    BUFFER SORT        |      |     1 |    12 |     2   (0)| 00:00:01 |
    |   5 |     TABLE ACCESS FULL | C    |     1 |    12 |     2   (0)| 00:00:01 |
    |   6 |   TABLE ACCESS FULL   | A    |     1 |    12 |     2   (0)| 00:00:01 |
    ------------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   1 - access("C"."C"="A"."A" AND "A"."A"="B"."B")Note
    -----
       - dynamic sampling used for this statement (level=2)可以看出B和Cmerge join之后与A做hash join。
      

  4.   

    如果只是内连接的话就 a=b and a=c 就行了啊