Вставить в ... значения (SELECT ... FROM ...) - PullRequest
1262 голосов
/ 25 августа 2008

Я пытаюсь INSERT INTO таблицу, используя данные из другой таблицы. Хотя это вполне выполнимо для многих механизмов баз данных, мне всегда трудно вспомнить правильный синтаксис для механизма SQL дня ( MySQL , Oracle , SQL Сервер , Informix и DB2 ).

Существует ли синтаксис «серебряной пули», исходящий из стандарта SQL (например, SQL-92 ), который позволил бы мне вставлять значения, не беспокоясь о базовой базе данных?

Ответы [ 23 ]

6 голосов
/ 13 февраля 2018
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;
1 голос
/ 04 апреля 2019

Два подхода для вставки в с помощью подзапроса select.

  1. С подзапросом SELECT, возвращающим результаты с Одна строка .
  2. С подзапросом SELECT, возвращающим результаты с Несколько строк .

1. Подход для подзапроса With SELECT, возвращающего результаты с одной строкой .

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

В этом случае предполагается, что подзапрос SELECT возвращает только одну строку результата на основе условия WHERE или агрегатных функций SQL, таких как SUM, MAX, AVG и т. Д. В противном случае он выдаст ошибку

2. Подход для подзапроса With SELECT, возвращающего результаты с несколькими строками .

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

Второй подход будет работать в обоих случаях.

0 голосов
/ 09 июня 2017

Если вы идете по маршруту INSERT VALUES для вставки нескольких строк, обязательно разделите VALUES на наборы, используя круглые скобки, поэтому:

INSERT INTO `receiving_table`
  (id,
  first_name,
  last_name)
VALUES 
  (1002,'Charles','Babbage'),
  (1003,'George', 'Boole'),
  (1001,'Donald','Chamberlin'),
  (1004,'Alan','Turing'),
  (1005,'My','Widenius');

В противном случае MySQL возражает, что «Количество столбцов не соответствует количеству значений в строке 1», и вы в конечном итоге пишете тривиальный пост, когда, наконец, решаете, что с этим делать.

...