2016-12-08 10 views
1

私は一緒に結合し、欠落している翻訳の出力を生成する3つのテーブルを持っています。複数の結合結果セット

----------------------------- 
Table 1 - Languages 
-----------------------------  
LanguageID Name 

-----------------------------  
    Table 2 - Phrase 
-----------------------------  
PhraseID  Text 

----------------------------------------------------------  
        Table 3 - Transaltion 
----------------------------------------------------------  
TranslationID PhraseID LanguageID Text 

私はフレーズごとに、すべての言語を返すSQLクエリを作成しようとした以下のコードを持つ訳があるかどう示しています。しかし、私が欲しいものを出力していないのですが、出力には翻訳に存在するレコードだけが表示されます。以下のコードは私がやっているものです。

SELECT 
     P.PhraseID 
    ,L.LanguageID 
    ,T.TranslationID 
FROM 
    Phrase P 
    LEFT JOIN Translation T ON T.PhraseID = P.PhraseID 
    RIGHT OUTER JOIN [Language] L ON T.LanguageID = L.LanguageID OR L.LanguageID IS NULL 

私はおそらく単純なものがありません。しかし、誰かが私を正しい方向に向けることを望んでいた。

EDIT:

Exepected出力

---------------------------------------------------------- 
Phrase ID Language ID TranslationID 
---------------------------------------------------------- 
    1   1   1    
    1   2   NULL   <--- Missing translation 

SOLUTION:

SELECT 
    P.PhraseID, 
    L.LanguageID, 
    T.TranslationID 
FROM [Language] L 
    CROSS JOIN Phrase P 
    LEFT JOIN Translation T ON T.LanguageID = L.LanguageID AND T.PhraseID = P.PhraseID 
WHERE P.[Text] = 'Barcode' 
+1

問題は何ですか?サンプルデータと期待される結果を示してください。 [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

+0

'T.PhraseID'がヌルで、' L.LanguageID'がNULLでないケースを探しています。 – FDavidov

+0

LEFT JOINとRIGHT JOINを混同しないでください。あまりにも混乱します。 ( 'LEFT JOIN'は常に'メインテーブルがオプションのデータをジョインしてメインテーブルに結合するのをはるかに理解しやすいので、常に 'LEFT JOIN 'に固執してください。) – jarlh

答えて

2

ここでは、不足している翻訳を取得するための一つの方法です:

select p.PhraseID, l.LanguageID 
from languages l cross join 
    phrases p left join 
    translations t 
    on t.LanguageID = l.LanguageID and t.PhraseID = p.PhraseId 
where t.LanguageId is null; 

このしくみを教えてください。 cross joinは、言語とフレーズのすべての組み合わせを生成します。 left joinは、既存の翻訳と一致するものを見つけます。 whereはマッチをフィルタリングします。 Voila!一致しないものはすべて

+0

なぜ 'クロスジョイン '? 'どこに' + 'クロスジョイント 'で読みやすい"内部 "になる – a1ex07

+0

@ a1ex07私は同じ解決策を考えたので、何を意味するのかわからない場合は、別の答えを投稿して –

+0

@JuanCarlosOropeza:好み - 私は 'クロスジョイン'を避けていました。この特殊なケースでは、 'CROSS JOIN language l'の代わりに' INNER JOIN languages l ON 1 = 1'を使用します。 – a1ex07

関連する問題