查询以获取每种语言的翻译

时间:2017-11-21 10:19:41

标签: sql sql-server

请帮我创建查询。我有像

这样的语言表
Id   Code
---------
1    EN
2    DE
3    RU

和带翻译的表

Id  Code  LanguageId  Value
------------------------------------------
1   1     1           EnglishTranslation
2   1     3           RussianTranslation
3   2     1           EnglishTranslation
4   2     2           DeutschTranslation
5   3     1           EnglishTranslation

我试图得到这个结果

 Id  Code  LanguageId  Value
 ------------------------------------------
 1   1     1           EnglishTranslation
 1   1     2           NULL
 2   1     3           RussianTranslation
 3   2     1           EnglishTranslation
 4   2     2           DeutschTranslation
 4   2     3           NULL
 5   3     1           EnglishTranslation
 5   3     2           NULL
 5   3     3           NULL

需要通过Code从翻译表获取所有语言的翻译到目前为止,我尝试

  select 
    T.id, T.Code, L.Id, T.Value
  from Languages L
  left join Translations T on T.LanguageId = L.Id

但我得不到预期的结果。你能否建议

http://sqlfiddle.com/#!6/e9bed/1

2 个答案:

答案 0 :(得分:2)

您可以使用CROSS JOIN运算符构建(LanguageId, Code)对的笛卡尔积和左连接转换表:

SELECT
    t.Id, y.Code, x.LanguageId, t.Value
FROM
    ((SELECT Id AS LanguageId FROM Languages) AS x
     CROSS JOIN
     (SELECT DISTINCT(Code) AS Code FROM Translations) AS y)
LEFT OUTER JOIN Translations t ON y.Code=t.Code AND x.LanguageId=t.LanguageId
ORDER BY t.Code, t.LanguageId

请注意,这不会为Translations中缺少的行生成有效的翻译ID,即结果如下所示:

   Id  Code  LanguageId  Value
---------------------------------------------
   1   1     1           EnglishTranslation
NULL   1     2           NULL
   2   1     3           RussianTranslation
   3   2     1           EnglishTranslation
   4   2     2           DeutschTranslation
NULL   2     3           NULL
   5   3     1           EnglishTranslation
NULL   3     2           NULL
NULL   3     3           NULL

Demo.

答案 1 :(得分:0)

我解决了这个问题并得到了你期望的结果。
运行以下查询:

{{1}}

您还可以在以下链接中查看解决方案:
http://sqlfiddle.com/#!6/e9bed/30 希望它可以随心所欲地工作。