다른 테이블에서 추출된 테이블 레코드에 INSERT를 수행하는 방법

StackOverflow https://stackoverflow.com/questions/74162

  •  09-06-2019
  •  | 
  •  

문제

테이블에서 데이터를 추출 및 변환한 다음 해당 데이터를 다른 테이블에 삽입하는 쿼리를 작성하려고 합니다.예, 이것은 데이터 웨어하우징 쿼리이고 MS Access에서 수행하고 있습니다.그래서 기본적으로 다음과 같은 쿼리를 원합니다.

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

시도했지만 구문 오류 메시지가 나타납니다.

이 일을 하고 싶다면 어떻게 하시겠습니까?

도움이 되었습니까?

해결책

"VALUES" 없음, 괄호 없음:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 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의 열)만으로 테이블을 생성한다는 점을 명심하세요.

VALUES와 괄호를 모두 제거하세요.

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

제거하다 VALUES 당신의 SQL에서.

이 경우 문제는 "값" 키워드라고 생각합니다.한 행의 데이터만 삽입하는 경우 "values" 키워드를 사용합니다.선택 결과를 삽입하는 데는 필요하지 않습니다.

또한 select 문 주위에 괄호가 실제로 필요하지 않습니다.

에서 msdn:

다중 레코드 추가 쿼리:

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

단일 레코드 추가 쿼리:

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

행 그룹을 추가할 때 "값"을 제거하고 추가 괄호를 제거합니다.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. 첫 번째 레코드 집합에서 사용할 수 있는 데이터로 두 번째 레코드 집합을 업데이트합니다(새 레코드를 추가하거나 기존 레코드를 업데이트하여).
  4. 두 레코드세트를 모두 닫습니다.

이 방법은 다른 데이터베이스의 테이블을 업데이트하려는 경우 특히 흥미롭습니다(즉, 각 레코드세트는 자체 연결을 가질 수 있습니다...).

한 테이블의 데이터를 다른 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

기존 테이블에 추출을 삽입하시겠습니까?

중요하지 않은 경우 아래 쿼리를 시도해 볼 수 있습니다.

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

추출된 정보를 사용하여 새 테이블 -> T1을 생성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top