【问题标题】:SQL join return results if where clause does not match如果 where 子句不匹配,SQL 连接返回结果
【发布时间】:2020-02-15 16:40:41
【问题描述】:

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

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

数据库 Postgresql

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化。当你得到一个你不期望的结果时,找出你的误解是什么。--隔离第一个意想不到的子表达式及其输入和输出。 (调试基础。)
  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 OUTER JOIN ON 之后,需要右 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN 删除任何具有扩展 NULL 的行,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有这个

标签: sql postgresql join left-join


【解决方案1】:

表的条件需要放在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 子句中的比较失败。

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2011-08-31
    • 2023-03-26
    • 2021-11-22
    • 1970-01-01
    • 2021-09-29
    • 2012-05-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多