私が見つけたもう1つの方法は、ROW_NUMBER関数を使用してテーブルを任意に結合し、その派生クエリを使用してFKを更新することです。tableAとtableBの間にはまだ関係がないという考えです。新しい外部キーを取得するには、それらをリンクする必要があります。ROW_NUMBERのような任意の値でそれらを結合すると、IDを取得する単一の行を選択する方法が得られます。
最初に新しいレコードを作成します
INSERT INTO TableB VALUES (value1)
それらを任意に結合するクエリをROW_NUMBERに記述します(これは次のステップで使用します)
SELECT
tableARows.Id,
tableBRows.TheNewId
FROM
(
SELECT Id, Row = ROW_NUMBER() OVER (ORDER BY Id) FROM tableA
)tableARows INNER JOIN
(
SELECT TheNewId, Row = ROW_NUMBER() OVER (ORDER BY TheNewId) FROM tableB
)tableBRows ON tableARows.Row = tableBRows.Row
次に、tableAにtableBからの新しいFKを入力するための完全なUPDATEステートメント
UPDATE tableA
SET tableA.ForeignKey = LinkedKeys.TheNewId
FROM
(
SELECT
tableARows.Id,
tableBRows.TheNewId
FROM
(
SELECT Id, Row = ROW_NUMBER() OVER (ORDER BY Id) FROM tableA
)tableARows INNER JOIN
(
SELECT TheNewId, Row = ROW_NUMBER() OVER (ORDER BY TheNewId) FROM tableB
)tableBRows ON tableARows.Row = tableBRows.Row
)LinkedKeys INNER JOIN
tableA ON tableA.Id = LinkedKeys.Id
これが私が使用したテーブル定義の例です。
CREATE TABLE tableA (Id INT, ForeignKey INT)
INSERT INTO tableA VALUES (100,NULL),(200,NULL),(300,NULL)
CREATE TABLE tableB (TheNewId INT)
INSERT INTO tableB VALUES(5000),(6000),(7000)