Я пытаюсь написать запрос, который извлекает и преобразует данные из таблицы, а затем вставляет эти данные в другую таблицу. Да, это запрос к хранилищу данных, и я делаю его в MS Access. Итак, в основном мне нужен такой запрос:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
(SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);
Я попытался, но получил сообщение об ошибке синтаксиса.
Что бы вы сделали, если бы захотели это сделать?


Удалите VALUES из вашего SQL.
Без «ЦЕННОСТЕЙ» и без скобок:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
Удалите ЗНАЧЕНИЯ и круглые скобки.
INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
У вас есть два варианта синтаксиса:
Опция 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).
Что ж, я думаю, что лучшим способом было бы (будет?) Определить 2 набора записей и использовать их как промежуточное звено между двумя таблицами.
Этот метод особенно интересен, если вы планируете обновлять таблицы из разных баз данных (т.е. каждый набор записей может иметь собственное соединение ...)
Я считаю, что ваша проблема в данном случае - ключевое слово "значения". Вы используете ключевое слово "values", когда вставляете только одну строку данных. Для вставки результатов выбора вам это не нужно.
Кроме того, вам действительно не нужны круглые скобки вокруг оператора select.
От msdn:
Запрос на добавление нескольких записей:
INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression
Запрос на добавление одной записи:
INSERT INTO target [(field1[, field2[, …]])]
VALUES (value1[, value2[, …])
Вы хотите вставить извлечение в существующую таблицу?
Если это не имеет значения, вы можете попробовать следующий запрос:
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1
GROUP BY LongIntColumn1);
Он создаст новую таблицу -> T1 с извлеченной информацией
Удалите «значения» при добавлении группы строк и удалите лишние скобки. Вы можете избежать циклической ссылки, используя псевдоним для 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;
вставка данных из одной таблицы в другую таблицу в другой БАЗЕ ДАННЫХ
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
собственно если нет. столбцов и их типов одинаковы, и они выходят в одном и том же порядке в таблицах, тогда вы можете просто сказать: INSERT INTO Table2 SELECT * FROM table1;