Select into select t sql: Предложение INTO (Transact-SQL) — SQL Server
Содержание
Как выполнить UPDATE из SELECT в SQL Server
В большинстве случаев обновления SQL выполняются с использованием прямых ссылок на определенную таблицу ( UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Тем не менее, иногда может оказаться полезным изменить содержимое таблицы косвенно , используя подмножество данных, полученных из оператора вторичного запроса.
Выполнение UPDATE
с использованием вторичного SELECT 9Оператор 0006 можно выполнить одним из двух способов, главным образом в зависимости от используемой версии SQL Server. Мы кратко рассмотрим оба варианта, чтобы вы могли найти тот, который лучше всего подходит для вас.
Использование ВНУТРЕННИХ СОЕДИНЕНИЙ
Для всех установок SQL Server самый простой метод выполнения этого действия — использование ВНУТРЕННИХ СОЕДИНЕНИЙ
, посредством чего значения в столбцах двух разных таблиц сравниваются друг с другом.
ОБНОВЛЕНИЕ книги НАБОР books.primary_author = авторы.имя ОТ книги ВНУТРЕННЕЕ СОЕДИНЕНИЕ авторы НА books.author_id = авторы.id ГДЕ books.title = 'Хоббит'
В приведенном выше примере мы ОБНОВЛЯЕМ
поле books.primary_author
, чтобы сопоставить author.name
для «Хоббита» путем ПРИСОЕДИНЕНИЯ
обеих таблиц в запросе к их соответствующим значениям author.id
и books.author_id
.
Использование MERGE для одновременного обновления и вставки
Для SQL Server 2008 и более поздних версий Microsoft представила исключительно полезную операцию MERGE
, которая аналогична приведенной выше 9.0005 INNER JOIN , но MERGE
пытается одновременно выполнить команду UPDATE
и INSERT
. Это эффективно синхронизирует две таблицы на основе выполненного запроса, обновляя и вставляя записи по мере необходимости для соответствия двух таблиц.
СЛИЯТЬ В книги С ИСПОЛЬЗОВАНИЕМ авторы НА books.author_id = авторы.id КОГДА СООТВЕТСТВУЕТ ТО ОБНОВЛЕНИЕ НАБОРА books.primary_author = авторы.имя КОГДА НЕ СООТВЕТСТВУЕТ ТО ВСТАВЛЯТЬ (книги.author_id, книги.основной_автор) ЦЕННОСТИ (авторы.id, авторы.имя)
Полный запрос при использовании MERGE
, безусловно, немного сложнее, чем при базовом INNER JOIN
, но как только вы поймете, как работает операция, вы быстро поймете, насколько мощной может быть эта возможность.
Первые несколько строк говорят сами за себя:
ОБЪЕДИНИТЬСЯ В книги С ИСПОЛЬЗОВАНИЕМ авторы НА books.author_id = авторы.id
Мы хотим ОБЪЕДИНИТЬ В
( ОБНОВЛЕНИЕ
/ ВСТАВИТЬ
) книг
, используя вторичную таблицу авторов
, и мы сопоставляем их на основе того же сравнения books.author_id = author.id
.
Команда MERGE
отличается следующей логикой ветвления.
КОГДА СООТВЕТСТВУЕТ ТО ОБНОВЛЕНИЕ НАБОРА books.primary_author = авторы.имя
Здесь мы просим SQL выполнить действие только тогда, когда записи MATCHED
— когда найдена существующая запись. В этом случае мы выполняем стандартный ОБНОВЛЕНИЕ
так же, как мы делали раньше, установив поле books.primary_author
равным полю author.name
.
Наконец, если запрос обнаруживает совпадающую сравнительную запись о том, что не существует, вместо этого мы выполняем INSERT
.
ЕСЛИ НЕ СООТВЕТСТВУЕТ ТО ВСТАВЛЯТЬ (книги.author_id, книги.основной_автор) ЦЕННОСТИ (авторы.id, авторы.имя)
Здесь мы просто просим SQL ВСТАВИТЬ
новую запись в books
таблица и передача значений полей author_id
и primary_author
, взятых из соответствующей записи таблицы авторов
.
Конечным результатом нашего оператора MERGE
является то, что для каждого автора в таблице авторов
мы проверяем, существует ли соответствующая книга в книгах
. Если запись найдена, мы гарантируем, что books.primary_author
установлено с помощью UPDATE
, а если совпадений не найдено, мы добавляем новую запись в книг
.
При этом вы должны иметь четкое представление о двух различных методах, которые можно использовать для UPDATE
записей в SQL с помощью вторичных операторов сравнения SELECT
.
Использование инструкции UPDATE from SELECT в SQL Server — Управление базой данных — Блоги
В этой статье мы рассмотрим различные методы использования инструкции UPDATE from SELECT в SQL Server.
В мире баз данных статические данные обычно не сохраняются. Вместо этого он продолжает меняться, когда мы обновляем существующие данные, архивируем или удаляем ненужные данные и многое другое. Например, предположим, что у вас есть таблица, в которой хранятся данные о ценах на товары для вашего торгового портала. Цены на товары постоянно меняются, так как вы можете предлагать своим клиентам скидки на товары в разное время. В этом случае вы не можете добавлять новые строки в таблицу, потому что запись о продукте уже существует, но вам необходимо обновить текущие цены на существующие продукты.
Здесь в игру вступает запрос UPDATE. Запрос UPDATE изменяет данные в существующей строке базы данных. Вы можете обновить все строки таблицы или ограничить затронутые строки для обновления, используя предложение WHERE. Обычно обновления SQL выполняются для существующей таблицы с прямой ссылкой. Например, в таблице [employee] требование должно увеличить зарплату всех активных сотрудников на 10%. В этом случае SQL-запрос прямой ссылки будет выглядеть так:
Обновить набор сотрудников [зарплата]= зарплата + (зарплата * 10 / 100) , где [активный]=1
Предположим, у вас есть другая таблица [Адрес], в которой хранятся местоположения сотрудников, и вам необходимо обновить таблицу [Сотрудник] на основе данных, доступных в таблице [Адрес]. Как вы обновляете данные в таблице [Сотрудник]?
К счастью, есть решение – UPDATE из инструкции SELECT. В следующем разделе мы рассмотрим различные способы выполнения обновлений с помощью инструкции SELECT. Например, таблица [Employee] имеет значения NULL для столбцов — [PostCode] и [City] на следующем снимке экрана. В таблице [Адрес] есть значения для обоих столбцов [Почтовый индекс] и [Город].
Способ 1: ОБНОВЛЕНИЕ из SELECT: Метод соединения
Этот метод использует соединения SQL для ссылки на дополнительную таблицу, содержащую значения, которые необходимо обновить. Таким образом, целевая таблица обновляется данными эталонных столбцов для указанных условий.
В этом случае довольно просто использовать инструкцию UPDATE from SELECT. Сначала вы можете использовать оператор SELECT для получения значений опорного столбца и целевого столбца.
ВЫБЕРИТЕ e.City,A.City, e.PostCode,A.PostCode ОТ Сотрудника e ВНУТРЕННЕЕ СОЕДИНЕНИЕ [Адрес] а ON e.EmpID = A.EmpID
Затем вы внесете небольшие изменения в свой запрос, и он подготовит оператор UPDATE, как показано ниже.
- Замените ключевое слово select на update.
- Укажите имя таблицы или псевдоним, который необходимо обновить.
- Используйте ключевое слово set и символ равенства (=) между ссылочным и целевым столбцами.
ОБНОВЛЕНИЕ e комплект e.City=A.City, e.PostCode=A.PostCode ОТ Сотрудника e ВНУТРЕННЕЕ СОЕДИНЕНИЕ [Адрес] a ON e.EmpID = A.EmpID
Затем выполните оператор UPDATE и убедитесь, что значения исходного и целевого столбцов совпадают.
Метод 2: ОБНОВЛЕНИЕ из SELECT: Оператор MERGE
Оператор MERGE полезен для манипулирования данными в целевой таблице на основе данных исходной таблицы как для совпадающих, так и для несовпадающих строк. Это альтернативный метод выполнения UPDATE из функции оператора SELECT.
В приведенном ниже примере оператора MERGE выполняются следующие задачи:
- Используйте оператор MERGE для обновления данных в таблице [Employee].
- Затем он ссылается на другую таблицу, когда применяется предложение USING.
- Затем WHEN MATCHED указывает объединение JOIN (внутреннее соединение) между исходной и целевой таблицами.
- Затем он обновляет [PostCode] и [City] из таблицы [Address] в таблицу [Employee] с помощью инструкции THEN UPDATE, за которой следует сопоставление исходного и целевого столбцов.
- Оператор MERGE всегда заканчивается точкой с запятой (;).
MERGE Сотрудник AS e ИСПОЛЬЗОВАНИЕ(ВЫБРАТЬ * ИЗ [Адрес]) КАК ON A.EmpID=e.EmpID КОГДА СООТВЕТСТВУЕТ, ТОГДА ОБНОВЛЯЕТ НАБОР e.PostCode=A.PostCode , е.Город = А.Город;
Метод 3: ОБНОВЛЕНИЕ из SELECT: Метод подзапроса
Подзапрос определяет внутренний запрос, который можно использовать внутри операторов SELECT, INSERT, UPDATE и DELETE. Это простой способ обновления существующих данных таблицы из других таблиц.
ОБНОВЛЕНИЕ Сотрудник SET Employee.City=(ВЫБЕРИТЕ [Адрес].город ОТ [Адрес] ГДЕ [Адрес].EmpID = Сотрудник.EmpId)
- Приведенный выше запрос использует оператор SELECT в предложении SET оператора UPDATE.
- Если подзапрос находит соответствующую строку, запрос на обновление обновляет записи для конкретного сотрудника.
- Если подзапрос возвращает NULL (нет соответствующей строки), он обновляет NULL для соответствующего столбца.
- Если подзапрос возвращает более одной совпадающей строки, оператор UPDATE вызывает ошибку — «Подзапрос SQL Server вернул более 1 значения. Это не разрешено, если в подзапросе используются операторы сравнения (=, !=, <, <= , >, >=)».
Ограничения подзапроса
- Подзапрос с оператором сравнения может включать только одно имя столбца, за исключением случаев, когда он используется для оператора IN или EXISTS. Поэтому, если нам требуется обновить несколько столбцов данных, нам нужны отдельные операторы SQL.
- В подзапросе нельзя использовать типы данных ntext , text и image .
- Подзапрос не может включать предложение GROUP BY и HAVING, если подзапрос содержит немодифицированный оператор сравнения. Немодифицированный оператор сравнения не может использовать ключевое слово ANY или ALL.
Сравнение производительности между различными операторами UPDATE из SELECT
В этом разделе мы проведем сравнение производительности между различными методами UPDATE из SELECT. Для этого мы начнем с совместного выполнения SQL-запросов, включив фактический план выполнения (Ctrl + M) в SQL Server Management Studio, и разделим их с помощью оператора Go.
В планах выполнения я получаю следующие данные для моей демонстрации:
- Метод соединения имеет стоимость запроса 41% (относительно всей партии)
- Оператор MERGE имеет стоимость запроса 34% (относительно общего пакета)
- Метод подзапроса имеет 24% стоимости запроса (относительно всего пакета)
Метод JOIN использует 40% стоимости для отдельной сортировки и 35% стоимости для обновления кластеризованного индекса.
Соединение слиянием использует внутреннее соединение для сопоставления строк данных между исходными и целевыми данными.