2012-02-06 74 views
1

以這兩個例子表:Oracle SQL - 連接不存在的行嗎?

Table A 
Name FirstOrLast 
Jeremy First 
Smith Last 
Mark First 
David First 


Table B 
Name 
Jeremy 
Smith 
Mark 
David 
Jones 
Jack 

我想輸出是這樣的:只輸出的名字,但如果如果它是一個姓或名,輸出也無妨表A不記錄。正確的輸出爲:

Jeremy 
Mark 
David 
Jones 
Jack 

我試圖實現這一點與外連接,就像這樣:

select 
    B.Name 
from 
    A, B 
where 
    A.name = B.name(+) and 
    A.FirstOrLast = 'First'; 

,但沒有運氣。我怎樣才能做到這一點?

回答

4

當您執行左外連接,也沒有紀錄Aa.firstOrLast將是無效的。當你在這,你還不如切換到標準語法加入:

select 
    B.Name 
from 
    B 
left outer join A on A.name = B.name 
where 
A.firstOrLast is null or A.firstOrLast = 'First'; 

然而,舊的語法也應該工作:

select 
    B.Name 
from 
    A, B 
where 
    A.name = B.name(+) and 
    (A.firstOrLast is null or A.firstOrLast = 'First'); 
+0

這很好。兩個問題:爲什麼「標準」語法更好(我的公司使用(+)語法,但我對sql很新,所以我願意改變我的樣式)。二,你能解釋一下A.name = B.name(+)在這裏完成的事情嗎? – Jeremy 2012-02-06 22:22:47

+2

@Jeremy舊的語法只適用於Oracle;新的語法適用於大多數現代RDBMS。在SQL進行了標準化之前,RDBMS供應商爲此定義了自己的語法:例如,Sybase使用了'A.name * = B.name'。外連接標記'(+)'表示「即使右邊的行不存在,也不要刪除左邊的行」。 – dasblinkenlight 2012-02-06 22:26:30

2

試試這個:

SELECT B.Name 
FROM B LEFT JOIN A ON B.Name = A.Name 
WHERE A.FirstOrLast = 'First' OR A.Name IS NULL; 
+0

這使與我的輸出相同(有或沒有我的外連接)。最後的A.name應該是A.FirstOrLast,但是我在我的問題中犯了同樣的錯誤。 – Jeremy 2012-02-06 22:19:28

+0

@Jeremy。這個答案和你接受的答案完全一樣,爲什麼說它不起作用? – gdoron 2012-02-07 05:58:21

+0

我不知道。我確定「或A.Name是NULL」不在那裏,但看起來它沒有被編輯過。我很困惑。好吧,無論如何我都會贊成,因爲這確實是一個完美的答案。 – Jeremy 2012-02-07 22:43:05

0
select b.name 
from b 
union 
select a.namfe 
from a 
where a.firstOrLast = 'First' 
0
SELECT Name 
FROM B 
MINUS 
SELECT Name 
FROM A 
WHERE FirstOrLast <> 'First'