SQL объединить возвращаемые результаты, если предложение where не совпадает - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь вернуть значения из объединения, где предложение where может не совпадать.

Вот моя схема базы данных

strings
-------
id: INT
name: VARCHAR
value: VARCHAR
fileId: INT FOREIGN KEY files(id)

languages
---------
id: INT
code: CHAR
name: VARCHAR

translations
------------
id: INT
string_id: INT, FOREIGN KEY strings(id)
language_id: INT, FOREIGN KEY languages(id)
translation: VARCHAR

Я пытаюсь выбрать все strings и все translations на данном языке. Переводы могут существовать или не существовать для данного языка, но я хочу вернуть strings любым способом.

Я использую запрос, подобный следующему:

SELECT s.id, s.name, s.value, t.translation
FROM strings s LEFT OUTER JOIN translations t ON s.id = t.string_id
WHERE s.file_id = $1 AND t.language_id = $2

Я хочу возвращать строки независимо от того, найдены ли совпадения в таблице переводов. Если переводы не существуют для данного языка, это поле, конечно, будет нулевым. Я думаю, что проблема в том, что предложение WHERE имеет t.language_id = ..., так как language_id не существует в данном конкретном случае. Но не уверен, что лучший способ это исправить.

База данных Postgresql

1 Ответ

3 голосов
/ 15 февраля 2020

Условия для таблицы second должны содержать go в предложении ON:

SELECT s.id, s.name, s.value, t.translation
FROM strings s LEFT OUTER JOIN
     translations t
     ON s.id = t.string_id AND t.language_id = $2
WHERE s.file_id = $1;

В противном случае t.language_id равно NULL, что не дает сравнения в WHERE предложение.

...