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

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

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

Для обновления данных в 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.

Пошаговый план для смены профессии

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

Если объемы обрабатываемых данных велики, проблема может быть решена созданием индексов на колонках, задействованных в соединении. Например, для ускорения работы колонки '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 — Статья, содержащая полезные советы по оптимизации производительности запросов при помощи подзапросов.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой SQL-запрос используется для обновления данных с использованием подзапроса?
1 / 5

Загрузка...