web-dev-qa-db-ja.com

OUTPUTをサブクエリテーブルに関連付けて挿入

データベースの構造を変更しています。テーブルFinancialInstitutionのいくつかの列の内容をテーブルPersonに転送する必要があります。 FinancialInstitutionは、外部キーを持つPersonにリンクされています。各金融機関には、対応する人物の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はそのように関連付けることができないようです...

22
Yugo Amaryl

これにはMERGEを(ab)使用できると思います。最初に(一時的な)テーブルを作成します。

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

18
ypercubeᵀᴹ