表與表之間連線式on,using以及自然連線的區別

warehouse發表於2011-11-22
群內經常有人問,簡單總結一下,剛接觸時可能有些不太好理解:[@more@]

on比較好理解,on後面可以出現關聯條件也可以出現非關聯條件:

SQL> create table t1(id int) tablespace users;

表已建立。

SQL> create table t2(id int,name varchar2(10)) tablespace users;

表已建立。

SQL> select t1.*,t2.* from t1 join t2 on t1.id=t2.id and t2.name='a';

未選定行

SQL> insert into t1 values(1);

已建立 1 行。

SQL> insert into t2 values(1,'a');

已建立 1 行。

SQL> insert into t2 values(2,'b');

已建立 1 行。

SQL> insert into t2 values(2,'a');

已建立 1 行。

SQL> commit;

提交完成。

SQL> select t1.*,t2.* from t1 join t2 on t1.id=t2.id and t2.name='a';

ID ID NAME
---------- ---------- ----------
1 1 a

--========================

下面是using:

SQL> select t1.*,t2.* from t1 join t2 using(id);
select t1.*,t2.* from t1 join t2 using(id)
*
第 1 行出現錯誤:
ORA-25154: USING 子句的列部分不能有限定詞


SQL> select t1.id,t2.id,t2.name from t1 join t2 using(id);
select t1.id,t2.id,t2.name from t1 join t2 using(id)
*
第 1 行出現錯誤:
ORA-25154: USING 子句的列部分不能有限定詞


SQL> select id,name from t1 join t2 using(id);

ID NAME
---------- ----------
1 a

SQL> alter table t1 add name varchar2(10) default 'a';

表已更改。

SQL> select id,name from t1 join t2 using(id,name);

ID NAME
---------- ----------
1 a

SQL> select id,name from t1 join t2 using(id);
select id,name from t1 join t2 using(id)
*
第 1 行出現錯誤:
ORA-00918: 未明確定義列


SQL> select id,t2.name from t1 join t2 using(id);

ID NAME
---------- ----------
1 a

SQL> select t2.id,t2.name from t1 join t2 using(id);
select t2.id,t2.name from t1 join t2 using(id)
*
第 1 行出現錯誤:
ORA-25154: USING 子句的列部分不能有限定詞


SQL> select id,name from t1 join t2 using(id,name);

ID NAME
---------- ----------
1 a

SQL> select id,name from t1 join t2 using(id,name);

所謂不能有限定詞是指using裡面的欄位前面不能有表別名。使用using要求表裡必須有相同的欄位,看的出來using和on想必靈活性差多了。

--==================================

自然連線:

SQL> select id,name from t1 natural join t2;

ID NAME
---------- ----------
1 a

SQL> select t1.id,t2.name from t1 natural join t2;
select t1.id,t2.name from t1 natural join t2
*
第 1 行出現錯誤:
ORA-25155: NATURAL 聯接中使用的列不能有限定詞


SQL>

所謂的自然連線就是說oracle會自動使用表裡面相同的欄位進行連線,這其實沒多少意義。同樣我們發現自然連結的欄位前面不允許有限定詞(表別名),這和using很相似。只不過using是和inner和outer join結合使用的,我到時覺得using應該和natural join結合使用更靈活,比如:

SQL> select id ,name from t1 natural join t2 using(id);
select id ,name from t1 natural join t2 using(id)
*
第 1 行出現錯誤:
ORA-00933: SQL 命令未正確結束


SQL>

如果上面sql可以執行,那麼就說明我們只需要透過id進行關聯,不需要name關聯。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1056486/,如需轉載,請註明出處,否則將追究法律責任。

相關文章