如果where子句不匹配,则SQL连接返回结果

时间:2020-02-15 16:40:41

标签: sql postgresql join left-join

我正在尝试从其中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

无论翻译表中是否找到匹配项,我都想返回字符串。如果不存在给定语言的翻译,则该字段当然为空。我认为问题在于具有{{1}的WHERE子句,因为在特定情况下t.language_id = ...不存在。但不确定解决此问题的最佳方法。

数据库Postgresql

1 个答案:

答案 0 :(得分:3)

表上的

条件需要放在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_idNULL,并且在WHERE子句中进行比较失败。

相关问题