Этот запрос:
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_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
.
Лично я считаю эту ошибку, потому что псевдоним таблицы всегда должен заменять ссылку на таблицу. Разработчики в Microsoft думают иначе. И нет никакого стандарта, который руководит этим синтаксисом.
Если у вас есть предложение FROM
, я рекомендую всегда использовать псевдонимы таблиц.
UPDATE A
SET FEEL = 'HAPPY'
FROM TABLE_A A INNER JOIN
TABLE_B B
ON A.SN = B.SN
WHERE B.WEATHER = 'SUNNY';