다른 테이블에서 추출 된 테이블 레코드에 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
실제로 아니라면. 열의 유형과 유형이 동일하고 테이블에서 동일한 순서로 종료되는 경우 간단히 INSERT INTO Table2 SELECT * FROM table1;
sactiw

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

이 경우 귀하의 문제는 "values"키워드라고 생각합니다. 한 행의 데이터 만 삽입 할 때는 "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

행 그룹을 추가 할 때 "값"을 제거하고 추가 괄호를 제거하십시오. 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 개의 레코드 세트를 정의하고 2 개의 테이블 사이의 중간으로 사용하는 것이 가장 좋은 방법이라고 생각한다.

  1. 두 레코드 세트 열기
  2. 첫 번째 테이블에서 데이터 추출 (SELECT blablabla)
  3. 첫 번째 레코드 세트에서 사용 가능한 데이터로 두 번째 레코드 세트 업데이트 (새 레코드 추가 또는 기존 레코드 업데이트)
  4. 두 레코드 세트를 모두 닫습니다.

이 방법은 다른 데이터베이스에서 테이블을 업데이트하려는 경우 특히 유용합니다 (예 : 각 레코드 세트에 자체 연결이있을 수 있음 ...)


2

하나의 테이블에서 다른 DATABASE의 다른 테이블로 데이터 삽입

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을 만듭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.