首页 > 解决方案 > 澄清 PostgreSQL 更新连接语句?

问题描述

我似乎找不到任何文档清楚地说明某些 update-join 语句如何在 PostgreSQL 中工作。假设数据库中有三个表:professorsclassesclassrooms。在professors表中,属性之一是 a class_id,即引用该classes表的外键。在classes表中,有一个classroom_id, 引用该classrooms表。这是我感兴趣的命令:

UPDATE classes c SET year = 2
FROM classes cl
JOIN professors on cl.class_id = professors.class_id
JOIN classrooms on cl.classroom_id = classrooms.classroom_id
WHERE cl.class_id = c.class_id

这似乎X = inner join(inner join(classes, professors), classrooms)year = 2包含在X. 这个对吗?此外,我不明白该WHERE条款是如何做到这一点的。为什么这行得通,为什么我不必使用IN关键字来完成这项任务?

我希望能简单而系统地解释UPDATE... FROM... JOIN... WHERE语句在 PostgreSQL 中的作用。太感谢了!

标签: sqlpostgresql

解决方案


我不确定这个解释是否真的系统,但这里有。

当您更新类时,它已经知道您正在处理什么表。在实践中,我通常不会在 FROM 之后再次引用该表,但我确信在某些情况下,执行连接可能比使用 WHERE 更可取。

您示例中的 WHERE 子句只是确保 classes 表的两个实例都处理相同的行。否则我想这将是一个外部连接。

在您的示例中,其他 JOINS 似乎没有意义。通常,当您可能希望将更新限制为某些教授时,例如 WHEREprofessor.professor='Einstein'。

最后,正如我所提到的,我通常不会第二次使用更新后的表,而是会使用。

UPDATE classes c SET year = 2
 FROM professors, classrooms 
 WHERE on c.class_id = professors.class_id
    AND c.classroom_id = classrooms.classroom_id

对我来说很好,但在某些情况下,其他语法可能更可取,特别是如果你想要左连接或类似的。


推荐阅读