서브 쿼리 테이블과 상관 된 OUTPUT으로 삽입


22

데이터베이스 구조를 수정하고 있습니다. FinancialInstitution 테이블의 여러 열 내용이 Person 테이블로 전송되어야합니다 . FinancialInstitution은 외래 키를 가진 사람과 연결되어 있습니다. 각 금융 기관에는 해당 개인의 ID가 필요합니다. 따라서 Person에 삽입 된 각 새 행에 대해이 새 행의 ID (IDENTITY)가 해당 FinancialInstitution 행으로 다시 복사되어야합니다.

이 작업을 수행하는 확실한 방법은 반복적 인 T-SQL 코드입니다. 그러나 세트 기반 작업으로 만 수행 할 수 있는지 알고 싶습니다.

나는 그러한 요청의 내부 수준이 다음과 같을 것이라고 상상했다.

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

불행히도 OUTPUT은 그런 식으로 상관시킬 수없는 것 같습니다 ...


테이블에 행을 삽입 Person하시겠습니까? 아니면 기존 업데이트? 아니면에 삽입 할 할 Person다음과 UPDATE FinancialInstitution?
ypercubeᵀᴹ

쿼리가 Person 테이블 만 업데이트하고 있습니다. 삽입 된 부분에서 사용하지 않으면 삽입 된 ID를 캡처 할 수 있지만 FinancialInstitution.ID는 캡처 할 수 없습니다. OUTPUT 절을 제거하면 쿼리가 배치되는 방식에 따라 INSERT 문의 열 수가 SELECT 문과 일치하지 않으므로 오류가 발생합니다.
datagod

ypercube : Person에 삽입 한 다음 Person의 새 행 ID로 FinancialInstitution을 업데이트하고 싶습니다.
유고 아마릴

datagod : 나는 유일한 업데이트를 알고 있습니다.이 쿼리는 미래 솔루션의 중첩 된 수준입니다. 그러나 나는 이미 거기에 붙어 있습니다. 선택 항목을 삽입하지 않으면 선택 항목에 ID를 추가 할 수 없습니다.
Yugo Amaryl

답변:


18

나는 당신 MERGE이 이것을 사용할 수 있다고 생각합니다 . 먼저 (임시) 테이블을 만듭니다.

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

그런 다음 MERGEPerson(대신 INSERT), 그래서 당신은 관련된 테이블의 열을 사용할 수 있습니다 OUTPUT절을 :

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

그런 다음 임시 테이블을 사용하여 다음을 수행하십시오 UPDATE FinancialInstitution.

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

테스트 : SQL-Fiddle

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