我在两个非常相似的PostgreSQL语句之间有一个问题:
UPDATE classes SET year = 1
FROM professors WHERE (professors.class = classes.class)
AND professors.name = 'Smith'`
这似乎是内部连接classes
表和professors
表,并仅更新classes
中相应教授的名字是Smith的记录。
UPDATE classes c SET year = 1
FROM classes cl JOIN professors on (professors.class_id = cl.class_id)
WHERE professors.name = 'Smith'`
这将更新类中的每条记录。为什么这个陈述与第一个陈述不同?
答案 0 :(得分:3)
在第二个中,您两次引用classes
。这是两个单独的引用,并且c
和cl
引用不相关。实际上,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
是不必要的,并且第一个查询是一种更好的方法(为此)。