sql - 对 PostgreSQL update join 语句的澄清?

标签 sql postgresql

我似乎找不到任何文档清楚地说明某些更新连接语句在 PostgreSQL 中的工作原理。假设数据库中有三个表:professorsclassesclassrooms。在 professors 表中,其中一个属性是 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) 并为 中包含的每个类(class)更新 year = 2 >X。它是否正确?此外,我不明白 WHERE 子句是如何实现这一点的。为什么这样做有效,为什么我不必使用 IN 关键字来完成此任务?

如果能简单而系统地解释 UPDATE...FROM...JOIN...WHERE 语句在 PostgreSQL 中的作用,我将不胜感激。非常感谢!

最佳答案

我不明白你的数据模型,因为似乎一位教授可以教授不止一门类(class)。

也就是说,您的查询是

UPDATE classes c
    SET year = 2
FROM classes c2 JOIN
     professors p
     ON c2.class_id = p.class_id JOIN
     classrooms cr
     ON c2.classroom_id = cr.classroom_id
WHERE c2.class_id = c.class_id;

FROM 子句正在执行 JOIN,正如您所期望的那样。您可以使用 SELECT 检查结果:

SELECT *
FROM . . . <the FROM clause here>

还发生了什么?好吧,UPDATE 告诉 Postgres 更新表 classes。忽略 classesFROM 子句中的事实(这是不同的引用)。

它如何知道要更新哪些记录?好吧,WHERE 子句表示更新与 FROM 匹配的行。在这种情况下,JOIN 正在执行过滤。

您也可以用INEXISTS 来表达这个逻辑:

UPDATE classes c
    SET year = 2
WHERE EXISTS (SELECT 1 FROM professors p WHERE c.class_id = p.class_id) AND
      EXISTS (SELECT 1 FROM classrooms cr WHERE c.classroom_id = cr.classroom_id);

我个人认为这个版本的意图更清晰。

关于sql - 对 PostgreSQL update join 语句的澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615221/

相关文章:

Postgresql Hstore 和 Toast 膨胀

postgresql - 如何在不嵌套输出的情况下在 Sequelize 中包含模型

SQL 服务器 2008 : complex Insert

mysql - MySQL 触发器中的持久/静态变量

发送给最终用户的 SQL : pros and cons

c# - 在复杂的大型 SQL 数据库上创建清晰的抽象层

postgresql - 自动更改 Postgres 表的所有者?

iphone - 从NSManagedObjects数组中查找属于某个关系的所有对象

sql - postgres 中的条件索引和触发器

PostgreSQL:错误: "-"处或附近的语法错误