Як зробити INSERT в записи таблиці, витягнуті з іншої таблиці


177

Я намагаюся написати запит, який витягує та перетворює дані з таблиці, а потім вставляю ці дані в іншу таблицю. Так, це запит на зберігання даних, і я це роблю в MS Access. Тому я хочу отримати такий запит:

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

Я спробував, але отримав повідомлення про помилку синтаксису.

Що б ви зробили, якщо хочете це зробити?

Відповіді:


283

Ні "ЦІННОСТІ", ні дужки:

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

11
насправді, якщо ні. стовпців та їх типів однакові, і ті, що виходять в одному порядку в таблицях, тоді ви можете просто сказати: ВСТАВИТИ В ТАБЛИЦЮ2 SELECT * FROM table1;
Сактів

28

У вас є два варіанти синтаксису:

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


24

Вилучіть як VALUES, так і круглі дужки.

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


10

Я вважаю, що вашою проблемою в цьому випадку є ключове слово "значення". Ви використовуєте ключове слово "значення", коли ви вставляєте лише один рядок даних. Для вставки результатів вибраного вам це не потрібно.

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

Від msdn :

Запит на додавання декількох записів:

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

Запит на додавання до одного запису:

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

4

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

Добре, я думаю, що найкращим способом було б (буде?) Визначити 2 набори записів і використовувати їх як проміжну між двома таблицями.

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

Цей метод особливо цікавий, якщо ви плануєте оновлювати таблиці з різних баз даних (тобто кожен набір записів може мати власне з'єднання ...)


2

вставлення даних із однієї таблиці в іншу таблицю в різних ДАТАБАЗАХ

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

1

Ви хочете вставити видобуток у існуючу таблицю?

Якщо це не має значення, ви можете спробувати наступний запит:

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

Це створить нову таблицю -> T1 з вилученою інформацією

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.