【问题标题】:How does PostgreSQL interpret these two join statements?PostgreSQL 如何解释这两个连接语句?
【发布时间】:2019-06-16 16:23:10
【问题描述】:

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

    这会更新类中的每条记录。为什么这句话和第一个不一样?

【问题讨论】:

  • 据我了解,第一种是在PostgreSQL中对两个表执行和UPDATE-JOIN的标准方式。
  • 第二个c.*cl.*没有链接。因此c. 的每条记录都由FROM 术语中的每个 结果行更新。
  • 如果您想在from 子句中显式引用classes,请在where 子句中添加另一个谓词:cl.class_id = c.class_id。此外,您的数据似乎没有标准化,即您似乎希望联接与class_idclass 等效。

标签: postgresql join sql-update


【解决方案1】:

在第二个中,您指的是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 是不必要的,第一个查询是更好的方法(为此目的)。

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多