Sql 为什么此联接更新查询更新所有值?
我犯了一些错误,一列的所有值都被更新了 我在SQLServer2008R2中这样做了 我应该运行如下查询:Sql 为什么此联接更新查询更新所有值?,sql,sql-server,Sql,Sql Server,我犯了一些错误,一列的所有值都被更新了 我在SQLServer2008R2中这样做了 我应该运行如下查询: 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 T
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';
甚至表C
也有[SN]
列
我希望这个查询将表A的FEEL更新为'HAPPY',其中表B的WEATHER
是'SUNNY',两个表之间有内部连接,但是FEEL
列的每个值都更新为'HAPPY'
在SQL Server中,从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';
是指更新表A
中与ON
和WHERE
子句中的条件匹配的所有行。但是,这些条件都不涉及表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 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对别名始终替换表引用的规则进行了例外。它仍然允许更新中的表A
引用A
。因此,没有交叉连接
P>个人认为,这种损坏是因为表别名应该总是替换表引用。微软的开发人员则不这么认为。而且没有指导这种语法的标准
如果有FROM
子句,我建议始终使用表别名
UPDATE A
SET FEEL = 'HAPPY'
FROM TABLE_A A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
是的,我肯定总是在UPDATE
之后使用表别名。否则事情会变得“危险”。-)谢谢你善意的回答。无疑是有帮助的!