PostgreSQL如何解释这两个连接语句?

时间:2019-06-16 16:23:10

标签: postgresql join sql-update

我在两个非常相似的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'`
    

    这将更新类中的每条记录。为什么这个陈述与第一个陈述不同?

1 个答案:

答案 0 :(得分:3)

在第二个中,您两次引用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是不必要的,并且第一个查询是一种更好的方法(为此)。