Обновление данных в SQL Server через SELECT запрос
Быстрый ответ
В процессе обновления строк одной таблицы при содействии данных из другой таблицы, стоит использовать INNER JOIN:
UPDATE t1
SET t1.col = t2.col
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.id = t2.id;
Можно рассматривать такой метод как повышенный SELECT
. Все ваши обновления в Table1
из Table2
выполняются быстро и точно. Кажется, всё очень просто? Но далеко не так!
Гром! Синхронизация с использованием MERGE
Если вам нужно синхронизировать две таблицы, лучшим помощником станет MERGE
. It's like a superhero, это как супергерой, выполняющий операции INSERT
, UPDATE
и DELETE
. Всё и сразу!
MERGE INTO Table1 t1
USING Table2 t2
ON t1.id = t2.id
WHEN MATCHED THEN
UPDATE SET t1.col = t2.col;
Ваши действия в MERGE
могут быть разнообразными, например, можно использовать фильтрацию данных и объединение операций в блоке USING
.
Коррелированные подзапросы — способ к технически совершенным обновлениям
Давайте окунемся в мир коррелированных подзапросов — это как дельфины в море SQL 🐬! Устанавливаем цели и избегаем ошибок:
UPDATE Table1
SET col = (SELECT col FROM Table2 WHERE Table2.id = Table1.id AND Table2.col IS NOT NULL)
WHERE EXISTS (
SELECT 1 FROM Table2 WHERE Table2.id = Table1.id AND Table2.col IS NOT NULL
);
Вуаля! 🎩 Наблюдайте, как исчезают все значения NULL
!
Транзакции для поддержания атомарности
Оформите своё обновление в виде транзакции. Этакий уютный плед, под которым ваши обновления остаются тёплыми. Так они будут оставаться последовательными и защищёнными даже при одновременных запросах пользователей к базе данных:
BEGIN TRANSACTION;
UPDATE t1
SET t1.col1 = t2.col1, t1.col2 = t2.col2
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.id = t2.id
WHERE t1.status = 'active';
COMMIT TRANSACTION;
Транзакция – ключ к атомарной безопасности обновлений в SQL!
Визуализация
Представьте себе художественную галерею, в которой каждое произведение хочет "обновить" свой облик с помощью новой рамы:
UPDATE Gallery SET FrameColor = S.FrameColor
FROM Paintings AS P
INNER JOIN SelectedFrames AS S ON P.ID = S.PaintingID
WHERE P.InExhibition = 1;
Сейчас, в роли картин, выступают строки, подлежащие обновлению. Что касается рамок, они представляют из себя свежие данные:
🖼️🖼️🖼️ (Угасшие картины без рам)
+
🖼️🎨🖼️ (Стильные рамы, готовые пригодиться)
=
🖼️🖼️🖼️ (Яркие картины в новых рамах)
Мы сопоставляем подходящую раму каждой картине, используя уникальный ID! 🆔 Это какой-то недельный показ моды для картин.
Искусство контроля над общим и частным
Никто не любит полуработы! Проверьте ваше условие WHERE. Лишний индекс? Слишком активные триггеры? Всё должно быть под строгим контролем.
Обновление нескольких колонок
Для обновления нескольких колонок, нужно прямолинейно заявить об этом!
UPDATE Table1
SET col1 = Table2.col1,
col2 = Table2.col2
FROM Table1
INNER JOIN Table2 ON Table1.id = Table2.id;
Быстро и ясно – это прекрасный бурный поток данных обновляющий всю вашу базу.
WHERE условие: точность обновления
Изменение с помощью SQL и условия WHERE
может быть чрезвычайно точечным, как хирургическое вмешательство, подайте скальпель, пожалуйста!
UPDATE Table1 AS t1
SET t1.col = t2.col
FROM Table2 AS t2
WHERE t1.id = t2.id AND t1.col <> t2.col;
Всё готово! Операция завершена. Были обновлены только строки с различающимися значениями.
Полезные материалы
- How do I UPDATE from a SELECT in SQL Server? – Stack Overflow — Отличная отправная точка для понимания UPDATE в SQL Server.
- UPDATE (Transact-SQL) – SQL Server | Microsoft Learn — Самые подробные данные от Microsoft по операции UPDATE.
- Advanced JSON Techniques in SQL Server – Part 3 — Беседы о JSON, но эта жемчужина для любителей SQL Server.