sql - 为什么这个 Join-Update 查询会更新所有值?
问题描述
我犯了一些错误,一列的所有值都被更新了。
我在 SQL Server 2008 R2 中做到了这一点。
我应该运行一些这样的查询:
UPDATE TABLE_A
SET FEEL = 'HAPPY'
FROM TABLE_A A
INNER JOIN TABLE_B B ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
但是,我犯了一个错误并运行了这个:
UPDATE TABLE_A
SET FEEL = 'HAPPY'
FROM TABLE_C A
INNER JOIN TABLE_B B ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
甚至TABLE_C
有一列[SN]
.
我希望此查询将 TABLE_A 的 FEEL 更新为“HAPPY”,其中WEATHER
的TABLE_B
“SUNNY”是两个表之间的内部连接,但列的每个值FEEL
都更新为“HAPPY”。
在 SQL Server 中意味着什么Update A set ~ from c
以及应该在什么时候使用它?为什么“内部连接”会更新所有值?
解决方案
这个查询:
UPDATE TABLE_A
SET FEEL = 'HAPPY'
FROM TABLE_C A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
是说更新与and子句TABLE_A
中的条件匹配的所有行。但是,这些条件都不涉及. 因此,没有任何内容被过滤。实际上,您所做的相当于:ON
WHERE
TABLE_A
UPDATE AA
SET FEEL = 'HAPPY'
FROM TABLE AA CROSS JOIN
TABLE_C A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
这在UPDATE
.
当你这样做时:
UPDATE TABLE_A
SET FEEL = 'HAPPY'
FROM TABLE_A A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
SQL Server 对别名总是替换表引用的规则做了一个例外。它仍然允许TABLE_A
在UPDATE
参考A
。所以,没有CROSS JOIN
.
就我个人而言,我认为这是一种损坏,因为表别名应始终替换表引用。微软的开发人员不这么认为。并且没有指导这种语法的标准。
如果您有FROM
子句,我建议始终使用表别名。
UPDATE A
SET FEEL = 'HAPPY'
FROM TABLE_A A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
推荐阅读
- python - 从python中的行绘制多条曲线
- google-cloud-platform - 有没有办法将谷歌云平台项目更改为其他 GCP 帐户?
- php - 如何在 excel 文件中导出视图数据并为特定列添加颜色
- java - Hibernate如何在内部将数据库中生成的ID(主键)设置为保存的对象?
- vue-component - Vue js - 未知转换“集合”
- php - 如何在 magento 2.3 中创建新表
- ios - 在 loadViewIfNeed 之后呈现视图控制器时应用程序崩溃
- google-cloud-pubsub - 如何处理消息被订阅者客户端确认失败?
- logging - 如何自动记录每个 thrift 请求方法和参数?
- html - 如何使用 html 中 form2 的提交按钮访问 form1 操作和数据