我犯了一些错误,并且列的所有值都已更新。
我在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]
的列。
我希望表_a的此查询更新为" happy",其中 TABLE_B
的 WEATHER
是'sunny',而两张表之间的内在加入,但是列FEEL
的每个值都更新为'happy'。
SQL Server中的Update A set ~ from c
意味着什么?为什么" Inner-Join"更新所有值?
此查询:
UPDATE TABLE_A
SET FEEL = 'HAPPY'
FROM TABLE_C A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';
说要更新符合ON
和WHERE
子句中条件的TABLE_A
中的所有行。但是,这些条件都不涉及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对Alias ewans始终替换表参考的规则有例外。它仍然允许UPDATE
中的TABLE_A
参考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';