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

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

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

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

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


person Martin08    schedule 16.09.2008    source источник


Ответы (9)


Без «ЦЕННОСТЕЙ» и без скобок:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
person pilsetnieks    schedule 16.09.2008
comment
собственно если нет. столбцов и их типов одинаковы, и те выходы в таблицах в том же порядке, то вы можете просто сказать: INSERT INTO Table2 SELECT * FROM table1; - person sactiw; 21.12.2015

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

Вариант 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).

person Jorge Ferreira    schedule 16.09.2008

Удалите ЗНАЧЕНИЯ и круглые скобки.

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

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

person Forgotten Semicolon    schedule 16.09.2008

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

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

Из msdn:

Запрос на добавление нескольких записей:

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

Запрос на добавление одной записи:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])
person Sean    schedule 16.09.2008

Удалите «значения» при добавлении группы строк и удалите лишние скобки. Вы можете избежать циклической ссылки, используя псевдоним для 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;
person Chris OC    schedule 16.09.2008

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

  1. Откройте оба набора записей
  2. Извлеките данные из первой таблицы (SELECT blablabla)
  3. Обновите второй набор записей данными, доступными в первом наборе записей (либо добавив новые записи, либо обновив существующие записи.
  4. Закройте оба набора записей

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

person Philippe Grondier    schedule 16.09.2008

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

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
person Community    schedule 08.12.2008

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

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

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

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

person Community    schedule 16.09.2008