2008-09-16 3 views
148

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

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

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

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

ответ

238

Нет "ЦЕННОСТИ", без скобок:

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

на самом деле если нет. столбцов и их типов одинаковы, а те, которые выходят в том же порядке в таблицах, вы можете просто сказать: INSERT INTO Table2 SELECT * FROM table1; – sactiw 2015-12-21 17:23:13

9

Удалить VALUES со своего SQL. не

18

Снимите оба значения и скобку.

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

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

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

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

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

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

7

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

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

msdn От:

Multiple-запись Append запрос:

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

Single-запись Append запрос:

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

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

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

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

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

2

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

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

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 
Смежные вопросы