我似乎找不到任何文档清楚地说明某些update join语句在PostgreSQL中是如何工作的。假设数据库中有三个表:professors
、classes
和classrooms
。在professors
表中,其中一个属性是一个引用class_id
表的外键。在classes
表中,有一个引用classes
表的classroom_id
。这是我感兴趣的命令:
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
这似乎可以计算
classrooms
并为X = inner join(inner join(classes, professors), classrooms)
中包含的每个类更新year = 2
。这是对的吗?此外,我不明白X
子句是如何实现这一点的。为什么这样做,为什么我不使用WHERE
关键字来完成这个任务?我希望能简单而系统地解释一下
IN
语句在PostgreSQL中的作用。非常感谢! 最佳答案
我不知道你的数据模型,因为一个教授似乎可以教不止一门课。
也就是说,你的问题是
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更新连接语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56615221/