日期:2014-05-17  浏览次数:20784 次

请问Oracle的FROM后面两种写法有什么区别?
写法一:
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是一样的吗?如果不一样,写法一到底是个什么意思?写法二我知道是什么意思

------解决方案--------------------
第一个是内连接,第二个是左外连接
------解决方案--------------------
都能实现,不知道查询速度上是否有区别
------解决方案--------------------
引用:
FROM TABLE_A A, TABLE_B B
WHERE A.A_ID = B.A_ID

FROM TABLE_A A
INNER JOIN TABLE B B
ON A.A_ID = B.A_ID

也就是说这两种写法的效果是一样的?

这两种效果是一样的. 
------解决方案--------------------
不加LEFT OUTER 是等效的,SQL等效不是很常见么?有什么奇怪的?
比如 col in (1,2,3) 与 col=1 or col=2 or col=3 这不就是等效的么...
sql语句在执行前,会进行变型,变换成优化器容易识别的等效SQL,如果你对优化器识别的那种SQL感兴趣,可以去学学,减少一个变型的步骤,是可以稍微提升点效率的。
------解决方案--------------------
这两种写法都可以,不过你的第一种是内连接,第二种是外连接,结果集可能是不同的。
如果你想做外连接,并且使用第一种写法,那么可以这样:

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

------解决方案--------------------
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;