sql - 澄清 PostgreSQL 更新连接语句?
问题描述
我似乎找不到任何文档清楚地说明某些 update-join 语句如何在 PostgreSQL 中工作。假设数据库中有三个表:professors
、classes
和classrooms
。在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 中的作用。太感谢了!
解决方案
我不确定这个解释是否真的系统,但这里有。
当您更新类时,它已经知道您正在处理什么表。在实践中,我通常不会在 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
对我来说很好,但在某些情况下,其他语法可能更可取,特别是如果你想要左连接或类似的。
推荐阅读
- c# - 如何更改此数组中的值?C#
- eclipse - xhtml 文件的 Eclipse Oxygen 3A 网页编辑器调色板内容
- php - PDO 全文搜索 - 即使字符串中的部分关键字在 db 列中也能获得结果
- java - 使用单独的线程更新全局 Hashmap 时出现 Nullpointer 异常
- ansible - 当串行参数多于一个时,Ansible 如何处理任务?
- variables - 如何限制捕食者“吃掉”的猎物数量并重新计算残留物?
- javascript - JSON中键中的@符号在访问时出错
- c# - 从数据库中将数据插入到组合框中
- sql - 带有 CASE 语句、多个变量和子变量的 SQL 查询
- mysql - 从 DATETIME 中选择每年每个月的最后插入值