Sql insert into from select sql: SQL INSERT INTO SELECT Statement

SQL — вставить значения с объединенными идентификаторами из другой таблицы | Майк Халс

У вас есть значения, для которых у вас есть идентификаторы в таблице. Вставьте идентификаторы за один раз!

Поиск некоторых идентификаторов (изображение Lucas Pezeta на Pexels)

Что вы делаете, когда наша таблица ожидает идентификаторы, но все, что у нас есть, это строки? Представим, что мы ресторан. Мы храним каждый пункт меню и его ингредиенты в нашей базе данных, чтобы мы могли отслеживать все виды статистики; как часто заказывают блюдо и какие ингредиенты наиболее популярны, например.

Мы хотим сохранить новый рецепт в таблице recipes, но есть проблема: в этой таблице требуется id_ингредиента, а не имя_ингредиента, которое у нас есть в данный момент. Как мы можем вставить эти идентификаторы в таблицу recipes, если у нас есть только имена?

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

  • поймете уникальную таблицу
  • поймете как использовать СКВОЗНУЮ таблицу
  • иметь возможность вставлять только уникальные значения в уникальную таблицу
  • иметь возможность вставлять в таблицу при извлечении идентификаторов из уникальной таблицы

Сначала мы настроим несколько таблиц, а затем перейдем к запросу .

В этом разделе мы определим структуру нашей базы данных и создадим все наши таблицы. Затем мы вставим в него некоторые тестовые данные. После этого мы перейдем к тому, как вставлять объединенные идентификаторы. Обратите внимание, что в этой статье используется Postgres, но одни и те же методы применимы ко всем реляционным базам данных 9.0005

Структура базы данных

Мы определим 3 таблицы: одна содержит ингредиенты, другая содержит рецепты, а третья таблица объединяет их вместе:

Структура базы данных нашего ресторана (изображение автора)

Таблица ингредиентов

Первая мы создадим таблицу ингредиентов и вставим некоторые данные. Проверьте эту статью для запроса, который может вставлять только ингредиенты, которых еще нет в таблице, чтобы убедиться, что мы никогда не получим ошибок. Для этого примера мы будем использовать «обычную» вставку ниже:

Таким образом, наша таблица выглядит так:

Наши недавно вставленные ингредиенты

Таблица рецептов

В этой таблице будут храниться рецепты, которые имеют уникальный идентификатор и имя:

Таблица наших рецептов

Таблица ингредиентов рецептов

Эта таблица соединяет один или несколько рецептов для одного или нескольких ингредиентов. Этот тип таблицы известен как «сквозная таблица»; он служит посредником между двумя таблицами, имеющими отношения «многие ко многим». В рецепте может быть несколько ингредиентов, а один ингредиент может быть частью нескольких рецептов.

Мы соединим их вместе с recipe_id и ингредиентом_id:

T

Теперь все наши таблицы созданы, давайте начнем вставлять!

Наши столы готовы, начинаем готовить! (изображение Maarten van den Heuvel на Pexels)

Давайте перейдем к нашей проблеме. Мы хотим создать несколько записей, которые соединяют запись в таблице рецептов с некоторыми записями в таблице ингредиентов. Для этого нам нужен recipe_id и ингридиент_id. Проблема в том, что у нас нет ингридиентов id, только названия ингредиентов. Как мы можем вставить в таблицу recipe_ingredients? Сейчас мы предполагаем, что знаем recipe_id; значение 1. Следующий запрос решает эту проблему:

Давайте посмотрим и пройдемся по запросу.

  • Строки с 1 по 8; здесь мы определяем набор данных, который хотим вставить. Мы знаем название ингредиента и количество.
  • В строке 9 мы говорим, что хотим вставить recipe_id, ингридиент_ид и количество в таблицу recipe_ingredients. Это наша цель
  • В данных SELECT из наших входных значений (строки с 1 по 8), которые мы определяем как d . Мы присоединяем этот набор данных к таблице ингредиентов, сопоставляя названия ингредиентов.
  • Здесь происходит волшебство: как видите, мы выбираем значение 1 для recipe_id, идентификатор из объединенной таблицы ингредиентов и количество из набора входных данных.

Принимая во внимание recipe_id

Хитрость заключается в том, чтобы определить наши входные данные как набор данных, соединить их с необходимыми таблицами, а затем вставить только идентификаторы. Довольно легко, верно? Давайте попробуем это на более сложном примере, где мы присоединяем не только ингридиент_ид, но и рецепт_ид.

Мы дважды выполняем трюк из предыдущего запроса: мы присоединяем рецепт из входных значений в столбце рецепта в таблице рецептов. Затем мы извлекаем идентификатор рецепта из этой таблицы и вставляем его в recipe_ingredients. Посмотрите результат ниже:

Мы вставили ингридиент_ид, соответствующий правильному рецепту_ид. Идеальный!

В этой статье мы рассмотрели несколько довольно изящных приемов: таблица UNIQUE, таблица THROUGH и вставка объединенных значений. Я надеюсь пролить на них свет. Если у вас есть предложения/пояснения, пожалуйста, прокомментируйте, чтобы я мог улучшить эту статью. А пока ознакомьтесь с другими моими статьями на всевозможные темы, связанные с программированием, например:

  • УДАЛИТЬ В другую таблицу
  • ОБНОВИТЬ В другую таблицу
  • Вставка, удаление и обновление в ОДНОМ выражении
  • ОБНОВЛЕНИЕ ВЫБЕРИТЕ пакет записей
  • Сохранить обновление
  • Вставка в УНИКАЛЬНУЮ таблицу

Удачного кодирования!

— Майк

P. S. Нравится, что я делаю? Подписывайтесь на меня!

SQL SERVER — как преобразовать набор результатов оператора Select в операторы Insert когда им необходимо перенести небольшой объем данных из одного экземпляра в другой или из одной среды в другую. Недавно я создал одну из новых баз данных филиалов моего клиента из базы данных других филиалов и столкнулся с этим сценарием. К счастью, со времен SQL Server 2005 у нас есть решение, но оно было очень сложным, особенно когда вам нужно было сделать это для таблиц, так как они имеют множество столбцов.

причина Я пишу это решение в том, что вы можете сделать это за несколько кликов в SQL Server 2012 и выше.
Прежде чем приступить к решению, я хотел бы создать образец для демонстрации решения.

Образец:
Ниже приведен оператор выбора, в котором я изменил набор результатов для демонстрации.

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБЕРИТЕ [ИД отдела]
,[Имя] + 'Отдел' Как [Имя]
,[Имя группы]
,Getdate() как [ModifiedDate]
ОТ [Отдела кадров]. [Отдел]
ИДТИ
 

Ниже приведены два решения, одно из которых является традиционным, а другое можно использовать в SQL Server 2012 и более поздних версиях.

Решение 1. Использование конкатенации строк (традиционный метод)
В этом решении необходимо объединить результирующий набор оператора Select, чтобы преобразовать его в оператор Insert (с некоторыми изменениями данных). Вы должны убедиться, что одинарные кавычки (‘) находятся в правильных местах. Кроме того, если данные в результирующем наборе не относятся к строковому типу данных, вы должны преобразовать их в строковый тип данных для объединения. В случае, если в таблице есть столбец идентификаторов, вы должны передать имя столбца в операторе INSERT, а также с помощью SET IDENTITY_INSERT. Причина, по которой я НЕ  рекомендовать это решение, потому что если у вас больше столбцов в таблице, это также займет больше времени для разработки и отладки.

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБИРАТЬ
'ВСТАВИТЬ В tbl_sample (
[DepartmentID],[Name],[GroupName],[ModifiedDate])
ЗНАЧЕНИЯ(' + ПРЕОБРАЗОВАТЬ(VARCHAR(50),[DepartmentID])
+ ',''' + [Имя] + 'Отдел'','
+ ''''+ [Имя группы] + ''','
+ ''''+ ПРЕОБРАЗОВАТЬ(VARCHAR(50),GETDATE(),120) + ''')'
ОТ [Отдела кадров]. [Отдел]
ИДТИ
 

Решение 2. Использование сценария создания (новый метод)
Этот метод применим к SQL Server 2012 и более поздним версиям и покажется вам довольно простым. Позвольте мне объяснить этот метод, используя два простых шага.

Шаг 1:
Прежде всего, вам нужно разработать оператор выбора, как это сделал я в образце, на основе ваших требований и ВСТАВИТЬ В ТАБЛИЦУ, как показано ниже.

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБЕРИТЕ [ИД отдела]
,[Имя] + 'Отдел' Как [Имя]
,[Имя группы]
,Getdate() как [ModifiedDate]
INTO [tbl_Department_Sample] -- Результирующий набор вставлен в таблицу
ОТ [Отдела кадров].[Отдел]
ИДТИ
 

Шаг 2:
Набор результатов оператора select вставлен в таблицу ([tbl_Department_Sample]). Теперь вам просто нужно сгенерировать сценарий (только данные) таблицы ([tbl_Department_Sample]), используя функцию «Создать сценарий» в SQL Server 2012 и более поздних версиях.