Использование оператора SELECT в команде INSERT
Использование оператора SELECT в команде INSERT
Оператор SELECT в команде INSERT позволяет взять данные из одной или нескольких таблиц и вставить их в другую таблицу. Если вы вставляете значения только для части столбцов, определить значения для других столбцов можно будет позднее с помощью оператора UPDATE.
Если вы вставляете строки из одной таблицы в другую, эти таблицы должны иметь совместимую структуру, т.е. соответствующие столбцы должны иметь одинаковый тип, или же система должна уметь автоматически выполнять нужное преобразование.
Если столбцы в обеих таблицах совместимы по типам и определены в одинаковом порядке в соответствующих операторах CREATE TABLE, перечислять их в команде INSERT необязательно.
Пример
Предположим, что в таблице sale_arhiiv содержатся строки с информацией о продажах в том же формате, что и в таблице tbl_sale.
Для добавления в таблицу sale_arhiiv строк из таблицы tbl_sale, содержащих данные о проджах за 2004 год в можно воспользоваться следующей командой:
SQL:
INSERT INTO sale_arhiiv
SELECT sale_id, client_id, prod_id, amount, saledate
FROM tbl_sale
WHERE YEAR(saledate)=2004
или
INSERT INTO sale_arhiiv
SELECT *
FROM tbl_sale
WHERE YEAR(saledate)=2004
Если столбцы в двух таблицах (таблица, в которую вы вставляете данные, и таблица, из которой вы берете данные) определены в разном порядке в соответствующих операторах CREATE TABLE, для установления соответствия между ними можно воспользоваться предложениями INSERT или SELECT.
ПримерНапример, предположим, что в операторе CREATE TABLE для таблицы tbl_sale столбцы определены в следующем порядке — sale_id, client_id, prod_id, amount, saledate, a для таблицы sale_arviiv — sale_id, prod_id, client_id saledate и amount. Тогда установить соответствие между ними можно с помощью оператора INSERT. Для этого столбцы таблицы sale_arhiiv нужно перечислить в предложении INSERT:
SQL:
INSERT INTO sale_arhiiv
(sale_id, client_id, prod_id, amount, saledate)
SELECT *
FROM tbl_sale
WHERE YEAR(saledate)=2004
Такой же результат можно получить, перечислив в нужном порядке столбцы таблицы tbl_sale в предложении SELECT:
SQL:
SELECT sale_id,prod_id, client_id, saledate amount
FROM tbl_sale
WHERE YEAR(saledate)=2004
Одним из преимуществ использования оператора SELECT в команде INSERT является возможность включения в него различных выражений (expression) — строк символов, математических формул и функций, позволяющих манипулировать вставляемыми данными.
Кроме того, с помощью оператора SELECT можно добавлять данные как во все сразу, так и в отдельные столбцы, по аналогии с предложением VALUE. Для этого нужно просто задать имена столбцов, в которые вы хотите добавить данные в предложении INSERT
Пример
Ниже приводится пример предложения SELECT, в котором над столбцом выполняются математические действия.
Предположим, что описываемая нами компания купила продукцию у другой фармацевттической компании. Причем, по счастливой случайности, для описания продукции эта компания использовала таблицу tbl_prod с той же структурой, что и таблица tbl_product. Однако при покупке стоимость продукции была увеличена на 10%. Кроме того, данные будут добавлены во все поля таблицы tbl_product, кроме поля tbl_group. Оператор, увеличивающий значения стоимости товаров вставляющий строки из таблицы tbl_prod в таблицу tbl_product, имеет следующий вид:
SQL:
INSERT INTO tbl_product(prod_id, pr_name,price)
SELECT prod_id, name, price * 1. 1 FROM tbl_prod
« Previous | Next »
Создание запросов результатов вставки — визуальные инструменты базы данных
Редактировать
Твиттер LinkedIn Фейсбук Эл. адрес
- Статья
- 4 минуты на чтение
Применимо к: SQL Server (все поддерживаемые версии)
Вы можете копировать строки из одной таблицы в другую или внутри таблицы с помощью запроса «Вставить результаты». Например, в titles
, вы можете использовать запрос «Вставить результаты», чтобы скопировать информацию обо всех названиях для одного издателя во вторую таблицу, которую вы можете сделать доступной для этого издателя. Запрос «Вставить результаты» аналогичен запросу «Создать таблицу», но копирует строки в существующую таблицу.
Совет
Вы также можете копировать строки из одной таблицы в другую, используя вырезание и вставку. Создайте запрос для каждой таблицы и выполните запросы. Скопируйте нужные строки из одной таблицы результатов в другую.
При создании запроса на вставку результатов вы указываете:
Таблицу базы данных, в которую нужно скопировать строки (целевую таблицу).
Таблица или таблицы, из которых необходимо скопировать строки (исходная таблица). Исходная таблица или таблицы становятся частью подзапроса. Если вы копируете внутри таблицы, исходная таблица совпадает с таблицей назначения.
Столбцы в исходной таблице, содержимое которых вы хотите скопировать.
Целевые столбцы в целевой таблице, в которую копируются данные.
Условия поиска для определения копируемых строк.
Порядок сортировки, если вы хотите копировать строки в определенном порядке.
Параметры группировки, если вы хотите скопировать только сводную информацию.
Например, следующий запрос копирует информацию о заголовке из таблицы titles
в архивную таблицу с именем archivetitles
. Запрос копирует содержимое четырех столбцов для всех заголовков, принадлежащих определенному издателю:
ВСТАВИТЬ В ЗАГЛАВИЕ АРХИВА (title_id, заголовок, тип, pub_id) ВЫБЕРИТЕ title_id, название, тип, pub_id ИЗ заголовков ГДЕ (pub_id = '0766')
Примечание
Чтобы вставить значения в новую строку, используйте запрос «Вставить значения».
Вы можете скопировать содержимое выбранных столбцов или всех столбцов подряд. В любом случае данные, которые вы копируете, должны быть совместимы со столбцами в строках, в которые вы копируете. Например, если вы скопируете содержимое такого столбца, как price
, столбец в строке, в которую вы копируете, должен принимать числовые данные с десятичными разрядами. Если вы копируете всю строку, целевая таблица должна иметь совместимые столбцы в том же физическом положении, что и исходная таблица.
При создании запроса «Вставка результатов» панель «Критерии» изменяется, чтобы отобразить параметры, доступные для копирования данных. Добавляется столбец Append, позволяющий указать столбцы, в которые следует копировать данные.
Предостережение
Вы не можете отменить действие выполнения запроса на вставку результатов. В качестве меры предосторожности создайте резервную копию данных перед выполнением запроса.
Чтобы создать запрос на вставку результатов
Создайте новый запрос и добавьте таблицу, из которой вы хотите скопировать строки (исходная таблица). Если вы копируете строки в таблице, вы можете добавить исходную таблицу в качестве таблицы назначения.
В меню Query Designer выберите Изменить тип и щелкните Вставить результаты .
В диалоговом окне «Выбрать целевую таблицу для вставки результатов» выберите таблицу, в которую необходимо скопировать строки (целевая таблица).
Примечание
Конструктор запросов и представлений не может заранее определить, какие таблицы и представления можно обновлять. Таким образом, список Имя таблицы в диалоговом окне Выбрать таблицу для вставки из запроса показывает все доступные таблицы и представления в запрашиваемом подключении к данным, даже те, в которые вы, возможно, не сможете скопировать строки.
В прямоугольнике, представляющем таблицу или объект с табличным значением, выберите имена столбцов, содержимое которых вы хотите скопировать. Чтобы скопировать строки целиком, выберите * (Все столбцы) .
Конструктор запросов и представлений добавляет выбранные вами столбцы в столбец Столбец панели критериев.
В столбце Добавить панели Критерии выберите целевой столбец в целевой таблице для каждого копируемого столбца. Выберите tablename.* , если вы копируете целые строки. Столбцы в целевой таблице должны иметь те же (или совместимые) типы данных, что и столбцы в исходной таблице.
Если вы хотите копировать строки в определенном порядке, укажите порядок сортировки. Дополнительные сведения см. в разделе Сортировка и группировка результатов запроса (визуальные инструменты для баз данных).
Укажите строки для копирования, введя условия поиска в столбце
Если не указать условие поиска, все строки из исходной таблицы будут скопированы в целевую таблицу.
Примечание
Когда вы добавляете столбец для поиска на панель критериев, конструктор запросов и представлений также добавляет его в список копируемых столбцов. Если вы хотите использовать столбец для поиска, но не копировать его, снимите флажок рядом с именем столбца в прямоугольнике, представляющем таблицу или объект с табличным значением.
Если вы хотите скопировать сводную информацию, укажите параметры «Группировать по». Дополнительные сведения см. в разделе Суммирование результатов запроса (визуальные инструменты для баз данных).
При выполнении запроса «Вставить результаты» результаты не отображаются в области результатов. Вместо этого появляется сообщение, указывающее, сколько строк было скопировано.
См. также
Типы запросов (визуальные инструменты для баз данных)
Практические руководства по разработке запросов и представлений (визуальные инструменты для баз данных)
Обратная связь
Отправить и просмотреть отзыв для
Этот продукт Эта страница
Просмотреть все отзывы о странице
SQL — вставить значения с объединенными идентификаторами из другой таблицы | Майк Халс
У вас есть значения, для которых у вас есть идентификаторы в таблице.
Вставьте идентификаторы за один раз! Поиск некоторых идентификаторов (изображение Lucas Pezeta на Pexels)Что вы делаете, когда наша таблица ожидает идентификаторы, но все, что у нас есть, это строки? Представим, что мы ресторан. Мы храним каждый пункт меню и его ингредиенты в нашей базе данных, чтобы мы могли отслеживать все виды статистики; как часто заказывают блюдо и какие ингредиенты наиболее популярны, например.
Мы хотим сохранить новый рецепт в таблице recipes, но есть проблема: в этой таблице требуется id_ингредиента, а не имя_ингредиента, которое у нас есть на данный момент. Как мы можем вставить эти идентификаторы в таблицу recipes, если у нас есть только имена?
В этой статье основное внимание уделяется хранению этих рецептов и ингредиентов самым рациональным способом с использованием уникальной таблицы ингредиентов. После прочтения этой статьи вы:
- поймете уникальную таблицу
- поймете как пользоваться СКВОЗНОЙ таблицей
- иметь возможность вставлять только уникальные значения в уникальную таблицу
- иметь возможность вставлять в таблицу при извлечении идентификаторов из уникальной таблицы
Сначала мы настроим несколько таблиц, а затем перейдем к запросу .
В этом разделе мы определим структуру нашей базы данных и создадим все наши таблицы. Затем мы вставим в него некоторые тестовые данные. После этого мы перейдем к тому, как вставлять объединенные идентификаторы. Обратите внимание, что в этой статье используется Postgres, но одни и те же методы применимы ко всем реляционным базам данных 9.0003
Структура базы данных
Мы определим 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
Хитрость заключается в том, чтобы определить наши входные данные как набор данных, соединить их с необходимыми таблицами, а затем вставить только идентификаторы. Довольно легко, верно? Давайте попробуем это на более сложном примере, где мы присоединяем не только ингридиент_ид, но и рецепт_ид.
Мы дважды выполняем трюк из предыдущего запроса: мы присоединяем рецепт из входных значений в столбце рецепта в таблице рецептов.