工作以來,碰到的第乙個oracle區別於sql server的地方,就是oracle的左右連線語句。這東西,還是舉個栗子來形容比較形象。乙個使用者表users(user_id,address),手機號碼表msisdns(user_id,msisdn)。對於每乙個使用者,使用者表都有對應的id對應,但並不是每個使用者都有手機號,因此,在手機號碼表並不一定有記錄。那我們先看下面的語句。
select u.address, m.msisdn
from users u, msisdns m
where u.user_id = m.user_id ;
很明顯,我們是在查詢使用者的位址和手機號碼,但這裡,我們加了乙個限制(u.user_id = m.user_id),這會出現什麼情況呢?比如:
users
user_id
address1北區
2南區msisdns
user_id
msisdn
11580601****
null
null
這樣,我們執行完語句,得到的只有一條記錄
北區,1580601****
但,這有時會不符合我們的要求,我們需要的是每個使用者的位址和手機號碼,即使沒有手機號碼,也必須把位址顯示出來。那要怎麼辦呢?接下來,我們對語句進行改造。
select u.address, m.msisdn
from users u, msisdns m
where u.user_id = m.user_id(+) ;
在msisdns表的user_id加上(+),這叫做左連線。我們來看結果。
北區,1580601****
南區,null
嗯,這就是我們想要的結果,南區這位使用者,沒有手機號碼,但我們還是得到了他的位址。
我們來分析一下,左連線,確切地說,就是將右表存在的與左表進行關聯,右表不存在的、左表存在的情況下,左表的值預設與右表的空記錄進行關聯。反之,右連線(u.user_id(+) = m.user_id),就是將左表存在的與右表進行關聯,左表不存在的、右表存在的情況下,右表的值預設與左表的空記錄進行關聯。可能講得有些混了,我們來翻譯一下這句左連線語句。
select u.address, (select m.msisdn from msisdns m where u.user_id = m.user_id)
from users u ;
可以看出,這裡會把每行users表的位址記錄都輸出來,然後根據users的user_id,去找msisdns表中對應的user_id,若沒有,則會以null輸出。
南區,null
因此,左連線就是保留左表,並盡量和右表關聯,沒有對應的記錄,以null代替。右連線反之亦然。
ps:本章我們提到的null,實質在資料庫中輸出來的是空,即空記錄,這裡用null來形象表示。在這裡,感謝太子爺lzw的技術支援。
oracle 左右連線
在oracle pl sql中,左連線和右連線以如下方式來實現 檢視如下語句 select emp name,dept name form employee,department where employee.emp deptid department.deptid此sql文使用了右連線,即 所在位...
oracle左右連線
create table test.test1 a int,b int create table test.test2 a int,b int insert into test.test1 values 1,456 insert into test.test1 values 2,427 insert...
oracle左右連線
左連線左邊的表資料應該是全的,應該是主表,有鏈結應該是右邊的表是全的是主表 因此記為 左連線左全,右連線右全。看下面的例項 create table student id number,name varchar2 20 create table score sid number,score numb...