Оператор обновления SQL обновляется

Меня смущает оператор Update, который на первый взгляд кажется простым. Мне нужно обновить значения в 4 столбцах в таблице 1 значениями из таблицы 2 на основе сопоставления двух отдельных столбцов из каждой таблицы. Вот общий синтаксис:

Update Table1 
set field1 = [table2 field1]
, field2 = [table2 field2]
, field3 = [table2 field3]
, field4 = [table2 field4]
--select *
from Table2 p inner join Table1 c
on p.matchfield1 = c.matchfield1 and p.matchfield2 = c.matchfield2
where c.database_id = 1 --qualifier since join clause may not provide unique result set 
and p.matchfield1 = 123456 --to test the statement on a single record first

Когда я запускаю предложение как оператор выбора, я получаю одну запись, как и ожидалось. Однако, когда я запускаю предложение обновления, используя тот же язык «из», я обнаруживаю, что запрос обновляет КАЖДУЮ строку в таблице 1 значениями из таблицы 2, где matchfield1 = 123456.

Мне интересно, нужно ли мне дополнительно уточнить мое предложение where для квалификации на основе значения matchfield2 (адрес eamil в моем примере), поэтому я бы добавил в конец оператора 'and p.matchfield2 = '[email protected] ''.

Я подозреваю, что мне очень далеко до этой работы, но в то же время это сводит меня с ума. Спасибо за любой совет!


person user3167010    schedule 06.01.2014    source источник
comment
Какую базу данных вы используете?   -  person Hart CO    schedule 07.01.2014
comment
Я использую SQL Server 2008. Извините, я не добавил это в исходный пост.   -  person user3167010    schedule 07.01.2014


Ответы (1)


Вместо того, чтобы выполнять JOIN в той же таблице, попробуйте это (при условии, что вы используете SQL Server)...

UPDATE Table1 
    set field1 = [table2 field1]
    , field2 = [table2 field2]
    , field3 = [table2 field3]
    , field4 = [table2 field4] 
FROM Table2 p        
WHERE database_id = 1 
    AND p.matchfield1 = 123456
    AND p.matchfield1 = matchfield1 AND p.matchfield2 = matchfield2

Вы также можете изменить свой запрос, чтобы ужесточить фильтрацию, добавив AND c.matchfield1 = matchfield1 AND c.matchfield2 = matchfield2 в предложение WHERE.

person user2989408    schedule 07.01.2014
comment
Спасибо за ответ. Это было очень полезно. Я предполагал, что мне нужно установить соединение между table1 и table2, прежде чем я смогу добавить database_id = 1 в предложение where. Я смог заставить это работать! Спасибо еще раз! - person user3167010; 07.01.2014
comment
@ user3167010 Таблица, которую вы пытаетесь обновить, работает как Таблица 1, поэтому FROM может иметь только другие таблицы. - person user2989408; 07.01.2014