【问题标题】:Postgresql multiple joins in single query where foreign key of a join doesn't exist in all tables单个查询中的 Postgresql 多个连接,其中连接的外键不存在于所有表中
【发布时间】: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 获取其数据

【问题讨论】:

    标签: sql postgresql select join


    【解决方案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 子句中撤消它们。
    • 您应该明确列出您想要的列。
    • 您应该限定多表查询中的所有列引用。
    • 表别名使查询更易于编写和阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多