Поскольку это довольно простой и часто встречающийся вопрос, я предполагаю, что вы новичок в продукте SQL Server с влиянием его версии 2008 R2.
Я рекомендую вам не пытаться писать новый код, используя собственный синтаксис UPDATE..FROM
, который, возможно, сохраняется только в продукте , чтобы оставаться совместимым с устаревшим кодом .
Также обратите внимание, что синтаксис UPDATE..FROM
может вызвать неожиданное и непредсказуемое поведение. например если ваш table2
содержал вторую строку для HORSE
с другим значением ID
, например,
CREATE TABLE table1 (ID INTEGER, NAME VARCHAR(10), NEWID INTEGER);
CREATE TABLE table2 (NAME VARCHAR(10), ID INTEGER);
INSERT INTO table1 VALUES (1, 'DOG', NULL),
(2, 'CAT', NULL),
(3, 'HORSE', NULL);
INSERT INTO table2 VALUES ('DOG', 100),
('CAT', 200),
('HORSE', 300),
('HORSE', 400);
Есть два возможных значения для HORSE
, 300
и 400
. Какой из них будет выбран, это недокументированное поведение и может быть непредсказуемым.
Вместо этого я рекомендую вам использовать синтаксис MERGE
, являющийся расширением стандартного SQL, например
MERGE INTO table1
USING table2
ON table1.NAME = table2.NAME
WHEN MATCHED THEN
UPDATE
SET NEWID = table2.ID;
Обратите внимание, что с добавлением строки, как описано выше, синтаксис MERGE
вызовет ошибку («Оператор MERGE попытался ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза ...»), что более желательно чем молча, используя произвольное и потенциально неправильное значение. Учтите, что если сегодня разработчики SQL Server действительно считают, что поведение UPDATE..FROM
желательно, то почему они не заставляют MERGE
работать так же?