首页 > 解决方案 > PostgreSQL 如何解释这两个连接语句?

问题描述

我在两个非常相似的 PostgreSQL 语句之间有一个问题:

  1. UPDATE classes SET year = 1
    FROM professors WHERE (professors.class = classes.class)
    AND professors.name = 'Smith'`
    

    这似乎是对classes表和professors表进行内连接,并且只更新classes对应教授姓名为 Smith 的记录。

  2. UPDATE classes c SET year = 1
    FROM classes cl JOIN professors on (professors.class_id = cl.class_id) 
    WHERE professors.name = 'Smith'`
    

    这会更新类中的每条记录。为什么这个说法与第一个不同?

标签: postgresqljoinsql-update

解决方案


在第二个中,您指的是classes两次。这是两个单独的引用,并且ccl引用不相关。事实上,在 上没有条件c,所以所有的行都被更新了。

可以添加相关条件:

UPDATE classes 
     SET year = 1
FROM classes cl JOIN
     professors p
     ON p.class_id = cl.class_id
WHERE p.name = 'Smith' AND cl.class_id = classes.class_id;

但是,这JOIN是不必要的,第一个查询是更好的方法(为此目的)。


推荐阅读