单个查询中的 Postgresql 多个连接,其中连接的外键不存在于所有表中

Posted

技术标签:

【中文标题】单个查询中的 Postgresql 多个连接,其中连接的外键不存在于所有表中【英文标题】:Postgresql multiple joins in single query where foreign key of a join doesn't exist in all tables 【发布时间】:2018-03-17 10:18:24 【问题描述】:

是否可以在单个查询中有两个连接,其中第二个连接是 table_2 和 table_3 之间的连接(table_1 中没有键引用)?

table_1

id | column_a



table_2

id | table_1_id | table_3_id | column_b



table_3

id | column_c

现有查询:

SELECT * FROM table_1 RIGHT OUTER JOIN table_2 WHERE table_1.id id = ? and WHERE column_a = ?

从 table_1 和 table_2 给我我想要的信息,但 table_2 的信息将只有 table_3_id 列。

在同一个查询中,我想加入 table_3 以根据 table_2.table_3_id 获取其数据

【问题讨论】:

【参考方案1】:

总之——是的。您可以添加更多 join 子句:

SELECT           * 
FROM             table_1 
RIGHT OUTER JOIN table_2 ON table_1.table_2_id = table_2.id
RIGHT OUTER JOIN table_3 ON table_2.table_3_id = table_3.id
WHERE            table_1.id = ? AND column_a = ?

【讨论】:

谢谢!我最初尝试过,但我的一个表名有错字,并认为这可能是不可能的【参考方案2】:

您的where 子句正在将right outer join 变成inner join。我一般不喜欢右连接。我认为左连接的语义更简单。

所以,你应该这样写:

SELECT . . .
FROM table_1 t1 JOIN
     table_2 t2
     ON t2.table1.id = t1.id JOIN
     table_3 t3
     ON t2.table3.id = t3.id
WHERE t1.id = ? AND column_a = ?;

注意事项:

您不应使用outer join,然后在where 子句中撤消它们。 您应该明确列出您想要的列。 您应该限定多表查询中的所有列引用。 表别名使查询更易于编写和阅读。

【讨论】:

以上是关于单个查询中的 Postgresql 多个连接,其中连接的外键不存在于所有表中的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql:FROM 中的子查询必须有别名 - 具有多个连接

无法使用 knex.js 中的连接复制 PostgresQL 查询

PostgreSQL 中具有特定模式的 Linq 和实体迁移

如何从 postgresql 10.3 中的这个多重连接查询中删除嵌套循环

使用 dplyr 过滤 postgreSQL 数据库中的多个值

PostgreSQL 中多个表的完全外连接