Обновление таблицы в SQL Server с использованием подзапроса
Быстрый ответ
Для обновления данных в SQL Server весьма удобно использовать команду UPDATE
в связке с подзапросом SELECT
. Пример такого готового запроса:
UPDATE t1
SET t1.target_field = sub.updated_value
FROM YourTable t1
JOIN (SELECT id, updated_value FROM SourceTable WHERE condition = 'Criteria') sub
ON t1.id = sub.id;
Убедитесь в корректности выполненного соединения и правильности выбранных полей. Чтобы предварительно увидеть результаты предполагаемых изменений перед исполнением запроса, можно заменить UPDATE
на SELECT
.
Ускорение работы за счет использования индексов
Если объемы обрабатываемых данных велики, проблема может быть решена созданием индексов на колонках, задействованных в соединении. Например, для ускорения работы колонки 'Name' в таблицах tempData
и tempDataView
выполним:
CREATE NONCLUSTERED INDEX idx_tempData_name ON tempData(Name);
CREATE NONCLUSTERED INDEX idx_tempDataView_name ON tempDataView(Name);
INNER JOIN
в этом контексте успешно справляется с задачей и делает обновление данными из другой таблицы remarkable быстрым.
Работа с псевдонимами и подзапросами
Псевдонимы полезнее всего для упрощения запросов. Особенно это актуально при использовании множественных соединений и подзапросов. Пример такого запроса на практике:
UPDATE t
SET t.Marks = sub.Marks
FROM tempDataView AS t
INNER JOIN (
SELECT Name, Marks FROM tempData WHERE Name = t.Name -- "Слово дня – 'имя'!"
) AS sub ON t.Name = sub.Name;
В примере подзапрос извлекает необходимые данные для обновления. Заменяя 'SELECT join' на 'UPDATE join', мы получаем возможность более понятного и эффективного обновления записей.
Решение сложных сценариев обновления
Перейдем к обсуждению решения таких задач как обновление данных в "один-ко-многим" отношении и сценариях без точного совпадения. Воспользуемся таким запросом:
UPDATE t
SET t.DetailField = COALESCE(sub.DetailValue, 'DefaultValue') -- "Изворотливый COALESCE!"
FROM YourTargetTable t
LEFT JOIN (
SELECT KeyField, DetailValue FROM SourceTable -- "Поймай их всех!"
) sub ON t.KeyField = sub.KeyField;
Вышеуказанный запрос точно обновит данные и даже установит значение по умолчанию, если в исходной таблице нет совпадающих записей. Осваивая эти умения, вы станете незаменимым мастером SQL.
Обновление данных на новом уровне
Уникальные ключи используются нами в борьбе против дубликатов и в случаях, когда подзапрос возвращает не одно, а несколько совпадений. Но сначала стоит проверить на наличие ошибок:
-- Проверяем возвращает ли наш подзапрос только одно значение для каждого ключа
SELECT KeyField, COUNT(*)
FROM SourceTable
GROUP BY KeyField
HAVING COUNT(*) > 1; -- "Уместный COUNT!"
Такая проверка перед обновлением помогает сохранить последовательность и достоверность данных.
Визуализация
Продемонстрируем схему обновления данных с использованием подзапроса в SQL Server, сравнив ее с ремонтом здания:
🏢 Наше Здание (Таблица) 🏢
├ Этажи (Строки)
└ Вывеска (Данные)
🛠️ Подрядчик (Запрос на обновление) 🛠️
└ Чертеж (Подзапрос)
...процесс...
В итоге, на каждом этаже старые вывески заменяются на новые:
UPDATE Building
SET Sign = (SELECT NewDesign FROM Architect WHERE Floor = CurrentFloor)
WHERE Floor IN (этажи, требующие обновления);
🏢 Новое Здание (Обновленная таблица) 🏢
├ Этажи (Строки с обновлениями)
└ Сияющие новые вывески (Обновленные данные) -- "Прекрасно!"
В результате каждый этаж получает именно ту вывеску, которая ему предназначена.
Мастерство работы с подзапросами
Конструирование SQL-запросов, которые работают как универсальный инструмент, выглядит следующим образом:
UPDATE p
SET p.SummaryData = sub.ComputedData
FROM ParentTable p
JOIN (
SELECT ForeignKey, SUM(DetailData) AS ComputedData -- "Считаем всё до единицы!"
FROM ChildTable
GROUP BY ForeignKey -- "Внимание, группируемся!"
) sub ON p.PrimaryKey = sub.ForeignKey;
Такое решение позволяет суммировать данные по строчной записи деталей и обеспечивает единственный источник истины в вашей базе данных.
Удаление данных с применением подзапросов
Не забудьте, что наши методы также подходят для удаления записей с использованием подзапросов:
DELETE FROM TargetTable
WHERE id IN (
SELECT id FROM SourceTable WHERE condition = 'Criteria'
);
Но всегда проверяйте условия с особым вниманием. Неловкое обращение с данными может привести к их нежелательной потере.
Полезные материалы
- Подзапросы (SQL Server) – SQL Server | Microsoft Learn — Детальное руководство по использованию подзапросов в SQL Server.
- SQL UPDATE Statement — Пошаговое описание основ использования команды UPDATE в SQL.
- Как выполнить UPDATE из SELECT в SQL Server? – Stack Overflow — Большое количество примеров использования SELECT при обновлении данных.
- Бесплатное модульное тестирование баз данных для инструментов SQL Server Data Tools — Статья, содержащая полезные советы по оптимизации производительности запросов при помощи подзапросов.