2014-02-11 55 views
1

的所有值我不明白爲什麼右外連接(下面的示例)沒有爲左外連接提供表的完整數據集;因爲外連接總是保留相應表的行。自加入SQL Oracle;爲什麼右外連接不保留表

創建表

create table join_test
(id number unique not null, name varchar2(10), department varchar2(10));

填充表

select * from join_test;

ID NAME   DEPARTMENT 
    1 stelios   sa 
    2 andros   sa 
    3 stav    ba 
    4 mary    ba 
    5 antonia   la 
    6 lambros   ka 

內加入

select j1.name, j1.department
from join_test j1 join join_test j2
on(j1.department=j2.department and j1.name<>j2.name);

NAME   DEPARTMENT 
    andros   sa 
    steliso   sa 
    mary   ba 
    stav   ba 

左外連接

select j1.name, j1.department
from join_test j1 left join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

NAME  DEPARTMENT 
    andros  sa 
    steliso sa 
    mary  ba 
    stav  ba 
    antonia la 
    lambros ka 

右外連接

select j1.name, j1.department
from join_test j1 right join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

NAME  DEPARTMENT 
    steliso sa 
    andros  sa 
    stav  ba 
    mary  ba 

更改選擇列表J2

select j2.name, j2.department
from join_test j1 right join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

NAME  DEPARTMENT 
andros  sa 
steliso sa 
mary  ba 
stav  ba 
antonia la 
lambros ka 
+0

這是在oracle中完成的 – Stelios

+0

這會在SQL Fiddle(http://www.sqlfiddle.com/#!4/1e7075/2)中產生正確的結果。您的示例運行出現問題。 –

回答

1

右和左連接執行相同的功能。您的示例中有什麼不同之處在於您正在選擇的表格。

這兩個查詢:

select j2.name,j2.department 
from join_test j1 left join join_test j2 
on(j1.department=j2.department and j1.name<>j2.name) 

select j1.name,j1.department 
from join_test j1 right join join_test j2 
on(j1.department=j2.department and j1.name<>j2.name) 

產生相同的結果:

NAME DEPARTMENT 
stelios sa 
andros sa 
stav ba 
mary ba 
(null) (null) 
(null) (null) 

原因在你的左邊和右邊之間看到結果的差別查詢是在例如,你一個重新從「駕駛」表中選擇(左表,J1)。連接顯示驅動表(J1)中的所有行,以及右側或非驅動表(J2)中的匹配行(不顯示)。

在你的權利的例子,你正在改變加入,但仍然選擇從J1。由於J1現在是非開車表,您只能看到J1的匹配結果。如果添加J2列的選擇,你會看到它的所有行:

NAME  DEPARTMENT NAME  DEPT 
stelios  sa   andros  sa 
andros  sa   stelios sa 
stav  ba   mary  ba 
mary  ba   stav  ba 
(null)  (null)  antonia la 
(null)  (null)  lambros ka 

你會看到一個離開了這個相同的結果加入,但空就沒有對方。

在這兩種情況下,(空)行都表示驅動表中不在非驅動表中匹配的行。

+0

感謝您的解釋。我想這是我使用相同的列名的事實;因爲它是同一張桌子,所以令我困惑。 感謝您澄清! – Stelios

2

這產生SQL小提琴正確的結果(sqlfiddle.com/#!4/1e7075/2) 。但是,我有一個懷疑。返回的結果是:

NAME DEPARTMENT 
stelios sa 
andros sa 
stav ba 
mary ba 
(null) (null) 
(null) (null) 

我懷疑,但是你正在返回的結果(或看着他們),與所有NULL值的行被忽略。嘗試選擇j2表格中的列並查看是否獲得更多結果。

+0

只是給出了原來的左連接相同的結果;所有的數據。說實話,你對空值的觀察讓我更加困惑。 – Stelios

+0

@ user3297834。 。 。在這個查詢中,左右連接應該產生相同的結果。我懷疑當你正在查看結果時,有些東西只用'NULL'值過濾掉了行。 –