【问题标题】:Left join query with all possible combinations具有所有可能组合的左连接查询
【发布时间】:2016-07-14 09:42:37
【问题描述】:

我有两张桌子:

语言,作为我的语言的索引。

isolanguage
"de"
"en"
"es"
"fi"
"fr"
"no"
"pl"
"ru"

还有翻译,我存储地点的翻译:

Name, translation, isolanguage
"Umeå Airport";"Flughafen Umeå";"de"
"Umeå Airport";"Umeå Airport";"en"
"Umeå Airport";"Aeropuerto de Umeå";"es"
"Umeå Airport";"Uumajan lentoasema";"fi"

我想要得到的是语言表中每种语言的翻译表中所有元素的列表。

预期结果:

"Umeå Airport";"Flughafen Umeå";"de"
"Umeå Airport";"Umeå Airport";"en"
"Umeå Airport";"Aeropuerto de Umeå";"es"
"Umeå Airport";"Uumajan lentoasema";"fi"
"Umeå Airport";NULL;"fr"
"Umeå Airport";NULL;"no"
"Umeå Airport";NULL;"pl"
"Umeå Airport";NULL;"ru"

关键是我需要所有语言,不管有没有翻译。

我正在尝试左连接查询,但不起作用,它只显示两个表中的元素(不包括 NULLS)

select * from languages a
left  join translations b
on (a.isolanguage = b.isolanguage)

"Umeå Airport";"Flughafen Umeå";"de"
"Umeå Airport";"Umeå Airport";"en"
"Umeå Airport";"Aeropuerto de Umeå";"es"
"Umeå Airport";"Uumajan lentoasema";"fi"
NULL;NULL;"fr"
NULL;NULL;"no"
NULL;NULL;"pl"
NULL;NULL;"ru"

【问题讨论】:

  • 您一定做错了什么或与您所描述的不同。我刚刚复制了您的设置,查询产生了您所需要的内容,包括带有NULL 的行进行翻译。
  • 你是对的。但我正在寻找的是也有第一个字段的值。例如:Umeå Airport;NULL;"fr" Umeå Airport;NULL;"no。如果我没有这个字段,我会有很多空字段,所有表都带有“fr”。
  • 好吧,在这种情况下,您需要规范化您的架构。将名称(第一列)提取到一个新表中并给它们一个 ID。然后您可以查询语言和这个新表的交叉产品,这将创建所有可能的条目。通过将其加入翻译表,您将获得所需的内容。
  • 原来的问题有点误导。

标签: sql postgresql join left-join


【解决方案1】:

你可以用这个:

select name, isolanguage, translation
from (
    select distinct t.name, l.isolanguage
    from translations t
    cross join languages l
    ) t
left join translations
using (name, isolanguage)
order by 1, 2;

     name     | isolanguage |    translation     
--------------+-------------+--------------------
 Umea Airport | de          | Flughafen Umea
 Umea Airport | en          | Umea Airport
 Umea Airport | es          | Aeropuerto de Umea
 Umea Airport | fi          | Uumajan lentoasema
 Umea Airport | fr          | 
 Umea Airport | no          | 
 Umea Airport | pl          | 
 Umea Airport | ru          | 
(8 rows)

【讨论】:

    【解决方案2】:

    你可以用

    SELECT Name, translation, isolanguage
    FROM 
    translations
    WHERE
    language.isolanguage=translation.isolanguage AND
    language.isolanguage = 'de' OR
    language.isolanguage = 'fr' OR .......
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多