Как сделать INSERT в таблицу записей, извлеченных из другой таблицы - PullRequest
171 голосов
/ 16 сентября 2008

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

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

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

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

Ответы [ 9 ]

272 голосов
/ 16 сентября 2008

Нет "VALUES", без скобок:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
25 голосов
/ 16 сентября 2008

У вас есть две опции синтаксиса:

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

23 голосов
/ 16 сентября 2008

Удалить оба значения и скобки.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
10 голосов
/ 16 сентября 2008

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

9 голосов
/ 16 сентября 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[, …])
4 голосов
/ 16 сентября 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;
2 голосов
/ 08 декабря 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
2 голосов
/ 16 сентября 2008

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

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

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

1 голос
/ 16 сентября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...