本篇文章給大家?guī)砹岁P(guān)于Oracle的相關(guān)知識,其中主要介紹了關(guān)于using關(guān)鍵字的相關(guān)知識,可以使用using關(guān)鍵字來簡化連接查詢,希望對大家有幫助。
推薦教程:《Oracle教程》
在工作中,查看到類似于如下的SQL語句:
select tb.usrnm, tb.typ, tb.oprorder from tb inner join rb1 using (stfaprid) where tb1.jugsumid = #jugsumid# and tb1.blnorg = #blnorg# and isvld = '1' order by tb.typ asc, tb.oprorder asc
sql/92標(biāo)準(zhǔn)可以使用using關(guān)鍵字來簡化連接查詢,但是只是在查詢滿足下面兩個條件時,才能使用using關(guān)鍵字進行簡化。
- 1.查詢必須是等值連接。
- 2.等值連接中的列必須具有相同的名稱和數(shù)據(jù)類型。
例如:使用using關(guān)鍵字,如下:
select emptno,ename,sal,deptno,dname from emp e inner join dept d using(deptno);
如上述語句執(zhí)行的結(jié)果與自然連接的結(jié)果相同。
使用using關(guān)鍵字簡化連接時,需要注意以下幾點:
- 1.使用emp表和dept表中的deptno列進行連接時,在using子句和select子句中,都不能為deptno列指定表名或表別名。
- 2.如果在連接查詢時使用了兩個表中相同的多個列,那么就可以在using子句中指定多個列名
形式如下:
select... from table1 inner join table2 using(column1,column2)
上述的語句相當(dāng)于下面的語句:
select... from table1 inner join table2 on table1.column1=table2.column2 and table1.column2=table2.column2;
如果對多個表進行檢索,就必須多次使用using關(guān)鍵字進行指定,形式如下:
select... from table1 inner join table2 using(column1) inner join table3 using(column2);
上述的語句相當(dāng)于下面的語句:
select... from table1,table2,table3 where table1.column1=table2.column1 and table2.column2=table3.column2;
再議using
在Oracle中的join連接中使用using關(guān)鍵字,是相對于natural join的。
我們在前面提到,如果是使用natraul join,并且兩張表中如果有多個字段是具有相同的名稱和數(shù)據(jù)類型的,那么這些字段都將被oracle自作主張的將他們連接起來。
但實際上我們有時候是不需要這樣來連接的。我們只需要將他們的多個具有相同的名稱和數(shù)據(jù)類型的字段中挑選一兩個。這時候我們就需要用到using 關(guān)鍵字了。下面是一個例子。
有一個表是sales,還有一個表是costs,這兩個表中都有兩個字段分別是pro_id和time_id。我們暫且不去考慮下面連接的實際意義,僅作語法上的研究。
如果使用natural連接,默認(rèn)情況下,兩個字段將會被自然地連接在一起。
Select * from Sales natural join costs;
和
Select * from Sales join costs on Sales.prod_id = costs.prod_id and sales.time_id = costs.time_id
和
Select * from Sales ,costs Where Sales.pro_id = cost.prod_id and sales.time_id = costs.time_id
得到的結(jié)果應(yīng)該是一樣的。
如果我們使用自然連接,就沒有機會控制連接條件,oracle自作主張的將兩個相同數(shù)據(jù)類型和名稱的字段自然地連接在一起了。
下面我們使用using關(guān)鍵字。
Select * from Sales join costs using(prod_id)
這樣就迫使oracle使用using指出的字段來做連接,而不是natural join連接中默認(rèn)的兩個。
請注意,這里的SQL語句沒有任何意義,只是為了說明using的用法舉了一個牽強的例子而已。
這里還需要說明的是:
如果在使用using關(guān)鍵字時,而且select的結(jié)果列表項中包含了using關(guān)鍵字所指明的那個關(guān)鍵字,那么請不要在select的結(jié)果列表項中對該關(guān)鍵字指明它屬于哪個表,例如如果使用using(prod_id),而在結(jié)果列表中要包含prod_id字段的話,請不要寫成sales.prod_id或者costs.prod_id而應(yīng)該寫成prod_id,而且也不要使用別名,就是使用例如prod_id as “產(chǎn)品編號”的形式。
- using中僅能使用一個列名。
- natural join關(guān)鍵字和using關(guān)鍵字是互斥的,也就是說不能同時出現(xiàn)。
推薦教程:《Oracle視頻教程》