我正在尝试从其中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
second表上的条件需要放在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
子句中进行比较失败。