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

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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
179
0
669 997
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

Ответ принят как подходящий

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

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

собственно если нет. столбцов и их типов одинаковы, и они выходят в одном и том же порядке в таблицах, тогда вы можете просто сказать: INSERT INTO Table2 SELECT * FROM table1;

sactiw 21.12.2015 20:23

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

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 набора записей и использовать их как промежуточное звено между двумя таблицами.

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

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

Я считаю, что ваша проблема в данном случае - ключевое слово "значения". Вы используете ключевое слово "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

Другие вопросы по теме