2014-02-13 54 views
0

這裏的關鍵是我的情況:如何從表A和C,由表B中的默認值由C加入值時,C沒有從A

我有3個表:

A: (A_id, Name) 

B: (B_id, A_id, Name) 

C: (C_id, B_id, State) 

我要的是有以下結果集:

A.A_id,A.Name, C.State 

的complicator是,我需要國家有一個默認值時,有沒有B數據鏈接。 在這種情況下,我想

A.A_id, A.Name, 'Default_Value' 

我不知道很多先進的SQL,所以任何指針十分讚賞。

回答

3
select 
coalesce(c.State, 'default value') 
from 
a 
left join b on a.id = b.A_id 
left join c on b.B_id = c.B_id 
+0

縮回我的,因爲鏈接到可怕的解釋+1使用ISNULL。 –

+0

這有什麼可怕的嗎?因爲它來自codinghorror.com?或者您是否想將其寫入其他答案中的w3schools鏈接? (這就是爲什麼我發佈它)。見w3fools.com – fancyPants

+0

這是一個很好的(非常好的)'UNION'和'EXCEPT'的視覺解釋。不加入。 –

2
SELECT A.A_id, A.Name, COASLESCE(C.State, 'Default_Value') 
FROM 
    A LEFT JOIN 
     (B INNER JOIN C ON C.B_id = B.B_id) 
    ON B.A_id = A.A_id 

一些信息:What is the difference between "INNER JOIN" and "OUTER JOIN"?

什麼公頃ppening這裏是,我們加入表B和C與INNER JOIN其中相應B_id列是相等的。 INNER指定僅當匹配C.B_id = B.B_id條件的兩個表中存在記錄時纔會返回結果。如果匹配條件存在

LEFT JOIN將加入這些組合值表A,同時仍從表A中返回記錄,如果不存在匹配。也就是說,如果沒有存在的條件B.A_id = A.A_idNULL值從加入的右側返回的列(在B和C加入)。我們執行COASLESCE,因此,如果查詢欄中有NULL返回,也可以默認爲某些特定值。

COALESCE執行此功能時,有一些額外的好處:http://msdn.microsoft.com/en-us/library/ms190349.aspx

最後一兩件事,表B在你的例子就是俗稱的結合表(或連接表,或橋臺)...... http://en.wikipedia.org/wiki/Junction_table

2

你可以在選擇

SELECT A.A_id,A.Name, ISNULL (C.State, 'Default_Value') 
from A 
left join b... 
left join c... 
+0

你的意思是'IFNULL()'? –

+0

我使用NULLIF http://technet.microsoft.com/en-us/library/ms177562.aspx。但我想這取決於你使用的db(和版本)...... –

+1

是的,如果兩個表達式相等,'NULLIF()'將返回NULL。我認爲OP沒有這樣做。 –

相關問題