我似乎找不到任何文档清楚地说明某些update join语句在PostgreSQL中是如何工作的。假设数据库中有三个表:professorsclassesclassrooms。在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。忽略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更新连接语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56615221/

10-15 19:43