postgresql - PostgreSQL 如何解释这两个连接语句?
问题描述
我在两个非常相似的 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'`
这会更新类中的每条记录。为什么这个说法与第一个不同?
解决方案
在第二个中,您指的是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
是不必要的,第一个查询是更好的方法(为此目的)。
推荐阅读
- java - 无法使用 JDK16.0.2、JavaEE8.0.1、TomCat9.0.52、Vaadin14.6.8 使 helloworld 类型的程序工作
- mysql - 确认我写的查询是否适合 mysql
- python - Python:使用文件列表搜索 XPath
- java - 使用java检索xml节点的值(根据特定属性)
- html - JwtAuthentication 标头不包含任何内容
- excel - 使用 vb.net 更改 excel 单元格颜色
- css - 当我用图像标签替换背景图像时 CSS 网格损坏
- google-cloud-platform - AI Notebook 的 Jupyterlab 运行状况检查失败
- sqlalchemy - SQLAlchemy NoSuchModuleError:无法加载插件:sqlalchemy.dialects:spanner
- c# - ASP.NET Core:UseRequestLocalization 为什么我们需要指定支持的文化列表?