Обновление таблицы в SQL Server с использованием подзапроса

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для обновления данных в SQL Server весьма удобно использовать команду UPDATE в связке с подзапросом SELECT. Пример такого готового запроса:

SQL
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Ускорение работы за счет использования индексов

Если объемы обрабатываемых данных велики, проблема может быть решена созданием индексов на колонках, задействованных в соединении. Например, для ускорения работы колонки 'Name' в таблицах tempData и tempDataView выполним:

SQL
Скопировать код
CREATE NONCLUSTERED INDEX idx_tempData_name ON tempData(Name);
CREATE NONCLUSTERED INDEX idx_tempDataView_name ON tempDataView(Name);

INNER JOIN в этом контексте успешно справляется с задачей и делает обновление данными из другой таблицы remarkable быстрым.

Работа с псевдонимами и подзапросами

Псевдонимы полезнее всего для упрощения запросов. Особенно это актуально при использовании множественных соединений и подзапросов. Пример такого запроса на практике:

SQL
Скопировать код
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', мы получаем возможность более понятного и эффективного обновления записей.

Решение сложных сценариев обновления

Перейдем к обсуждению решения таких задач как обновление данных в "один-ко-многим" отношении и сценариях без точного совпадения. Воспользуемся таким запросом:

SQL
Скопировать код
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.

Обновление данных на новом уровне

Уникальные ключи используются нами в борьбе против дубликатов и в случаях, когда подзапрос возвращает не одно, а несколько совпадений. Но сначала стоит проверить на наличие ошибок:

SQL
Скопировать код
-- Проверяем возвращает ли наш подзапрос только одно значение для каждого ключа
SELECT KeyField, COUNT(*)
FROM SourceTable
GROUP BY KeyField
HAVING COUNT(*) > 1;  -- "Уместный COUNT!"

Такая проверка перед обновлением помогает сохранить последовательность и достоверность данных.

Визуализация

Продемонстрируем схему обновления данных с использованием подзапроса в SQL Server, сравнив ее с ремонтом здания:

Markdown
Скопировать код
🏢 Наше Здание (Таблица) 🏢
├ Этажи (Строки)
└ Вывеска (Данные)

🛠️ Подрядчик (Запрос на обновление) 🛠️
 └ Чертеж (Подзапрос)

...процесс...

В итоге, на каждом этаже старые вывески заменяются на новые:

SQL
Скопировать код
UPDATE Building
SET Sign = (SELECT NewDesign FROM Architect WHERE Floor = CurrentFloor)
WHERE Floor IN (этажи, требующие обновления); 

🏢 Новое Здание (Обновленная таблица) 🏢
├ Этажи (Строки с обновлениями)
└ Сияющие новые вывески (Обновленные данные) -- "Прекрасно!"

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

Мастерство работы с подзапросами

Конструирование SQL-запросов, которые работают как универсальный инструмент, выглядит следующим образом:

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;

Такое решение позволяет суммировать данные по строчной записи деталей и обеспечивает единственный источник истины в вашей базе данных.

Удаление данных с применением подзапросов

Не забудьте, что наши методы также подходят для удаления записей с использованием подзапросов:

SQL
Скопировать код
DELETE FROM TargetTable
WHERE id IN (
 SELECT id FROM SourceTable WHERE condition = 'Criteria'
);

Но всегда проверяйте условия с особым вниманием. Неловкое обращение с данными может привести к их нежелательной потере.

Полезные материалы

  1. Подзапросы (SQL Server) – SQL Server | Microsoft Learn — Детальное руководство по использованию подзапросов в SQL Server.
  2. SQL UPDATE Statement — Пошаговое описание основ использования команды UPDATE в SQL.
  3. Как выполнить UPDATE из SELECT в SQL Server? – Stack Overflow — Большое количество примеров использования SELECT при обновлении данных.
  4. Бесплатное модульное тестирование баз данных для инструментов SQL Server Data Tools — Статья, содержащая полезные советы по оптимизации производительности запросов при помощи подзапросов.