多连接结果集

时间:2016-12-08 15:33:35

标签: sql sql-server

我有三个表,我想连接在一起并产生缺少翻译的输出。

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

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

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

我尝试创建一个Sql Query,它返回每个短语的所有语言,并显示是否有翻译,但下面的代码。然而,它不输出我想要的,输出仅显示翻译中存在的记录。以下代码就是我一直在玩的。

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
我可能错过了一些简单的事情。但希望有人能指出我正确的方向。

编辑:

预期输出

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

解决方案:

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 个答案:

答案 0 :(得分: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过滤了匹配项。瞧!一切都不匹配。