首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

请教Oracle的FROM后面两种写法有什么区别

2013-08-09 
请问Oracle的FROM后面两种写法有什么区别?写法一:SELECT * FROM TABLE_A A, TABLE_B B, TABLE_C CWHERE A.

请问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;



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_1ID_2ID_1ID_2ID_1ID_2
12b2a5a

写法二:
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_1ID_2ID_1ID_2ID_1ID_2
12b2a5a
21a
33c3b

热点排行
Bad Request.