我似乎找不到任何文档清楚地说明某些更新连接语句在 PostgreSQL 中的工作原理。假设数据库中有三个表:professors
、classes
和classrooms
。在 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
>XWHERE
子句是如何实现这一点的。为什么这样做有效,为什么我不必使用 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
。忽略 classes
在 FROM
子句中的事实(这是不同的引用)。
它如何知道要更新哪些记录?好吧,WHERE
子句表示更新与 FROM
匹配的行。在这种情况下,JOIN
正在执行过滤。
您也可以用IN
或EXISTS
来表达这个逻辑:
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/