Почему этот запрос Join-Update обновляет все значения? - PullRequest
2 голосов
/ 22 мая 2019

Я допустил ошибку, и все значения столбца обновлены.

Я сделал это в 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].

Я ожидал, что этот запрос обновит FEEL of TABLE_A как 'HAPPY', где WEATHER из TABLE_B - это 'SUNNY' с внутренним соединением между двумя таблицами, но каждое значение столбца FEEL обновлено до 'HAPPY'.

Что означает Update A set ~ from c в SQL Server и когда его следует использовать? И почему «inner-join» обновляет все значения?

1 Ответ

3 голосов
/ 22 мая 2019

Этот запрос:

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...