首页 > 解决方案 > 为什么在 UPDATE 的 FROM 子句中没有给出连接谓词时 postgres 不抛出错误

问题描述

例如在以下查询中:

UPDATE A
SET A.a = b.id
FROM (SELECT * FROM B) b;

此查询不会引发任何错误。在这种情况下 FROM 做了什么。它是否在 A 和 B 之间进行叉积,然后从 B 中选择一些随机条目?当我解释时,我看不到任何连接,当我在其中添加连接谓词时,就会出现哈希连接。但在这种情况下不是。

只是对功能感到好奇,不打算使用此查询。

标签: postgresql

解决方案


根据 Postgres 语法,您的查询实际上是一个更新连接,但它缺少WHERE提供两个表之间连接条件的子句。最有可能的是,您打算使用以下内容:

UPDATE A a
SET A.a = b.id
FROM B b
WHERE a.pk = b.fk;     -- join condition is here

就目前而言,表中的每条记录A都将连接到表中的每条记录B,因此更新逻辑没有很好地定义。


推荐阅读