1対0-1の関係を持つ2つのテーブルへの挿入ベースの設定
-
06-07-2019 - |
質問
2つのテーブルがあり、最初のテーブルにはIDであるプライマリキーがあり、2番目のテーブルにはないプライマリキーがありますが、そのキーには最初のテーブルのプライマリキーに戻る外部キー制約があります。
一度に1つのレコードを挿入する場合、Scope_Identityを使用して、2番目のテーブルに挿入するテーブル1に挿入したpkの値を取得できます。
私の問題は、両方のテーブルに挿入したい選択からの多くのレコードがあることです。これらの挿入を行うセットベースの方法を考えることができませんでした。
現在の解決策は、カーソルを使用して、最初のテーブルに挿入し、scope_identityを使用してキーを取得し、2番目のテーブルに挿入して、繰り返します。
非カーソルソリューションがありませんか?
解決
はい、Books onlineでoutput句を検索します。
他のヒント
今週、この問題が発生しました。誰かが無意味な代理キーを持つテーブルを、自然にキーが使用されるスキーマに導入しました。間違いなくすぐにこれを修正します:)それまでは、 INSERT
のデータテーブルを作成することでこれを回避しています:これは永続的または一時的なベーステーブルまたは派生テーブル(以下を参照してください)、それはいずれにせよセットベースのソリューションに対するあなたの欲求に合うはずです。このテーブルと、ナチュラルキーの IDENTITY
列を持つテーブルとの結合を使用して、自動生成された値を見つけます。以下に簡単な例を示します。
CREATE TABLE Test1
(
surrogate_key INTEGER IDENTITY NOT NULL UNIQUE,
natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);
CREATE TABLE Test2
(
surrogate_key INTEGER NOT NULL UNIQUE
REFERENCES Test1 (surrogate_key),
data_col INTEGER NOT NULL
);
INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col);
INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
FROM (
SELECT '0000000001', 22
UNION ALL
SELECT '0000000002', 55
UNION ALL
SELECT '0000000003', 99
) AS DT1 (natural_key, data_col)
INNER JOIN Test1 AS T1
ON T1.natural_key = DT1.natural_key;
所属していません StackOverflow