2016-07-14 2 views
0

У меня есть две таблицы:левый присоединиться запрос со всеми возможными комбинациями

языки, как индекс моих языков.

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" 
+3

Вы должны делать что-то неправильно или иначе, чем вы описали. Я только что воспроизвел вашу установку, и запрос дал именно то, что вам нужно, включая строки с «NULL» для перевода. –

+0

Вы правы. Но то, что я ищу, также должно иметь значение для первого поля. например: Аэропорт Умео; NULL; «fr» Аэропорт Умео, NULL; «Нет. Если у меня нет этого поля, у меня будет много пустых полей с« fr »для всего стола. – ppardoz

+1

Well , в этом случае вам нужно нормализовать вашу схему. Извлеките имена (первый столбец) в новую таблицу и дайте им идентификатор. Затем вы можете запросить перекрестное произведение языков и эту новую таблицу, которая создаст все возможные записи. По левому соединению с таблицей переводов вы получите то, что вам нужно. –

ответ

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) 
1

U можно использовать

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