为什么此加入更新查询更新所有值

  • 本文关键字:更新 查询 sql sql-server
  • 更新时间 :
  • 英文 :


我犯了一些错误,并且列的所有值都已更新。

我在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_BWEATHER是'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';

说要更新符合ONWHERE子句中条件的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';

最新更新