写法一:
SELECT * FROM TABLE_A A, TABLE_B B, TABLE_C C
WHERE A.A_ID = B.A_ID
AND B.C_ID = C.C_ID
;写法二:
SELECT * FROM TABLE_A A
LEFT OUTER JOIN TABLE_B B
ON A.A_ID = B.A_ID
LEFT OUTER JOIN TABLE_C C
ON B.C_ID = C.C_ID
;请问1和2是一样的吗?如果不一样,写法一到底是个什么意思?写法二我知道是什么意思

解决方案 »

  1.   

    FROM TABLE_A A, TABLE_B B
    WHERE A.A_ID = B.A_IDFROM TABLE_A A
    INNER JOIN TABLE B B
    ON A.A_ID = B.A_ID也就是说这两种写法的效果是一样的?
      

  2.   

    不加LEFT OUTER 是等效的,SQL等效不是很常见么?有什么奇怪的?
    比如 col in (1,2,3) 与 col=1 or col=2 or col=3 这不就是等效的么...
    sql语句在执行前,会进行变型,变换成优化器容易识别的等效SQL,如果你对优化器识别的那种SQL感兴趣,可以去学学,减少一个变型的步骤,是可以稍微提升点效率的。
      

  3.   

    这两种写法都可以,不过你的第一种是内连接,第二种是外连接,结果集可能是不同的。
    如果你想做外连接,并且使用第一种写法,那么可以这样:SELECT *
      FROM table_a a, table_b b, table_c c
     WHERE a.a_id(+) = b.a_id
       AND b.c_id(+) = c.c_id
      

  4.   

    create table table_a (id_1 number,id_2 varchar(2));
    insert into table_a values(1,'a');
    insert into table_a values(2,'b');
    insert into table_a values(3,'c');
    commit;create table table_b (id_1 number,id_2 varchar(2));
    insert into table_b values(2,'a');
    insert into table_b values(3,'b');
    insert into table_b values(4,'c');
    commit;create table table_c (id_1 number,id_2 varchar(2));
    insert into table_c values(5,'a');
    insert into table_c values(6,'c');
    insert into table_c values(7,'e');
    commit;写法一:(内连接)
    SELECT * FROM TABLE_A A, TABLE_B B, TABLE_C C
    WHERE A.id_1 = B.id_1
    AND B.id_2 = C.id_2
    等同于
    SELECT * 
     FROM TABLE_A A 
       inner join TABLE_B B on a.id_1=b.id_1 
       inner_join TABLE_C C on B.id_2 = C.id_2结果:
        ID_1 ID_2 ID_1 ID_2 ID_1 ID_2
    1 2 b 2 a 5 a写法二:
    SELECT * FROM TABLE_A A
    LEFT OUTER JOIN TABLE_B B
    ON A.id_1 = B.id_1
    LEFT OUTER JOIN TABLE_C C
    ON B.id_2 = C.id_2
    结果:
        ID_1 ID_2 ID_1 ID_2 ID_1 ID_2
    1 2 b 2 a 5 a
    2 1 a
    3 3 c 3 b