Обновление нескольких строк с помощью оператора select
У меня есть эти таблицы и значения:
Table1
------------------------
ID | Value
------------------------
2 | asdf
4 | fdsa
5 | aaaa
Table2
------------------------
ID | Value
------------------------
2 | bbbb
4 | bbbb
5 | bbbb
Я хочу обновить все значения в таблице2, используя значения в таблице1 с их соответствующими идентификаторами.
Есть ли способ сделать это с помощью простого SQL-запроса?
Ответы
Ответ 1
Запустите выбор, чтобы убедиться, что это то, что вы хотите
SELECT t1.value AS NEWVALUEFROMTABLE1,t2.value AS OLDVALUETABLE2,*
FROM Table2 t2
INNER JOIN Table1 t1 on t1.ID = t2.ID
Update
UPDATE Table2
SET Value = t1.Value
FROM Table2 t2
INNER JOIN Table1 t1 on t1.ID = t2.ID
Кроме того, рассмотрите возможность использования BEGIN TRAN
, чтобы при необходимости отбросить его, но убедитесь, что вы COMMIT
, когда вы удовлетворены.
Ответ 2
Если у вас есть идентификаторы в обеих таблицах, работает следующее:
update table2
set value = (select value from table1 where table1.id = table2.id)
Возможно, лучший подход - это соединение:
update table2
set value = table1.value
from table1
where table1.id = table2.id
Обратите внимание, что этот синтаксис работает в SQL Server, но может быть другим в других базах данных.
Ответ 3
Вы можете использовать псевдоним для улучшения запроса:
UPDATE t1
SET t1.Value = t2.Value
FROM table1 AS t1
INNER JOIN
table2 AS t2
ON t1.ID = t2.ID
Ответ 4
Я использовал это в MySQL, MS Access и SQL Server. Поля id - это поля, по которым таблицы совпадают, а не обязательно первичный индекс.
UPDATE DestTable INNER JOIN SourceTable ON DestTable.idField = SourceTable.idField SET DestTable.Field1 = SourceTable.Field1, DestTable.Field2 = SourceTable.Field2...
Ответ 5
SET SQL_SAFE_UPDATES = 0;
UPDATE m1,m2
SET m1.code = m2.code
WHERE
m1.name = (select distinct m2.name from m2 limit 1);
Здесь обновление происходит с palce в m1.code, где condtion выполняет поиск всех записей в подзапросе и возвращает все соответствующие строки. Я использую limit 1 для возврата одного вместо дубликатов. Вы можете использовать отдельный или лимит 1 или верхний 1 или иметь счетчик < 1
Sry, для моего английского