2014-01-27 87 views
-4

鑑於表的東西SQL Server查詢及OUTER JOIN

IdStuff StuffName IdLanguage 
------- --------- ---------- 
1  Stuff 1 1 
1  Stuff 2 2 

和視圖:vwLanguages

IdLanguage Name 
---------- ---- 
1   Language 1 
2   Language 2 
3   Language 3 

我想獲得:

IdStuff StuffName IdLanguage 
------- --------- ---------- 
1   Stuff 1 1 
1   Stuff 2 2 
1   NULL  3 

我已經試過RIGHT JOIN,但我沒有成功......

SELECT 
    S.IdStuff, S.StuffName, vwLanguages.IdLanguage 
FROM 
    Stuff S 
    RIGHT JOIN vwLanguages ON vwLanguages.IdLanguage = S.IdLanguage 

的問題是,只有2行顯示,語言1和語言2 ...

+4

向我們展示您的嘗試,至少。另外,我們如何「知道」我們應該爲最後一行生成'IdStuff'值? –

+0

什麼是錯誤信息? –

+0

即使CROSS JOIN也不會做你以後的事,儘管它會稍微接近。 –

回答

10

RIGHT JOIN幾乎都不是正確的做法。我認爲你在尋找什麼是獨特的stuff ID和language行,然後之間的CROSS JOIN一個LEFT JOINstuff細節,如果可用。:

SELECT 
    subStuff.IdStuff, 
    s.StuffName, 
    l.IdLanguage 
FROM 
(
    SELECT DISTINCT IdStuff 
    FROM Stuff 
) subStuff 
CROSS JOIN vwLanguages l 
LEFT JOIN Stuff s 
    ON s.IdStuff = subStuff.IdStuff 
    AND s.IdLanguage = l.IdLanguage 

SQL Fiddle

您需要的CROSS JOIN原因基本上是想讓來自stuff的每個不同的ID與來自language的每條記錄匹配,即使沒有匹配的IdLanguage。一旦你有這兩套笛卡爾產品,你就想得到StuffName,如果它恰好有相應的stuff ID和language ID。

該實現有點難以解釋,因爲需求有點奇怪,並且不能真正匹配您的表結構。

例如,爲什麼IdStuff表在stuff表中不唯一?

我假設這是一個人爲的例子,但它引發了很多其他問題。

+0

感謝您的查詢!如果你解釋爲什麼RIGHT JOIN不是解決方案,我將不勝感激。 – user3104183

+0

@ user3104183您可能可以通過'RIGHT JOIN'獲得正確的結果,但是您可以重新排序您的連接並使用'LEFT'來代替樣式原因...大多數人會同意它只是流動或讀取比' RIGHT'。 –

+0

問題是一樣的,即使是左或右外連接... – user3104183