Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么此联接更新查询更新所有值?_Sql_Sql Server - Fatal编程技术网

Sql 为什么此联接更新查询更新所有值?

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

我犯了一些错误,一列的所有值都被更新了

我在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 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
之后使用表别名。否则事情会变得“危险”。-)谢谢你善意的回答。无疑是有帮助的!