Как сделать INSERT в записи таблицы, извлеченные из другой таблицы

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

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

Я попробовал, но получил сообщение об ошибке синтаксиса.

Что бы вы сделали, если хотите сделать это?

Ответ 1

Нет "VALUES", нет круглых скобок:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;

Ответ 2

У вас есть два варианта синтаксиса:

Вариант 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

Вариант 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

Имейте в виду, что Вариант 2 создаст таблицу с только столбцами на проекции (те, что указаны в SELECT).

Ответ 3

Удалите оба значения и круглые скобки.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1

Ответ 4

Удалите VALUES из вашего SQL.

Ответ 5

Я считаю, что ваша проблема в этом случае - это ключевое слово "values". Вы используете ключевое слово "values", когда вы вставляете только одну строку данных. Для вставки результатов выбора вам это не нужно.

Кроме того, вам действительно не нужны скобки вокруг оператора select.

От msdn:

Запрос на несколько записей:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

Запрос с одной записью:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

Ответ 6

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

  • Откройте оба набора записей
  • Извлечь данные из первой таблицы (SELECT blablabla)
  • Обновить второй набор записей с данными, доступными в первом наборе записей (путем добавления новых записей или обновления существующих записей
  • Закройте оба набора записей

Этот метод особенно интересен, если вы планируете обновлять таблицы из разных баз данных (т.е. каждый набор записей может иметь свое собственное соединение...)

Ответ 7

Удалите "значения", когда вы добавляете группу строк, и удалите дополнительные круглые скобки. Вы можете избежать циклической ссылки, используя псевдоним для avg (CurrencyColumn) (как и в вашем примере) или вообще не используя псевдоним.

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

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

И он будет работать без псевдонима:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;

Ответ 8

Вы хотите вставить извлечение в существующую таблицу?

Если это не имеет значения, вы можете попробовать следующий запрос:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

Он создаст новую таблицу → T1 с извлеченной информацией

Ответ 9

Вставка данных из одной таблицы в другую таблицу в другой БАЗЕ ДАННЫХ

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup