正規化について述べている上記の答えは素晴らしいです!しかし、私のように、データベーススキーマや構造をそのまま使用することを許可されていない立場にいるとしたらどうでしょうか。たとえば、DBAは「神」であり、提案されたすべてのリビジョンは/ dev / nullに行きますか?
その点では、上記のコードサンプルを提供しているすべてのユーザーに関して、このスタックオーバーフローの投稿でも回答されているように感じます。
INSERT VALUES WHERE NOT EXISTSからのコードを再投稿しています。これは、基になるデータベーステーブルを変更できないため、最も役立ちました。
INSERT INTO #table1 (Id, guidd, TimeAdded, ExtraData)
SELECT Id, guidd, TimeAdded, ExtraData
FROM #table2
WHERE NOT EXISTS (Select Id, guidd From #table1 WHERE #table1.id = #table2.id)
-----------------------------------
MERGE #table1 as [Target]
USING (select Id, guidd, TimeAdded, ExtraData from #table2) as [Source]
(id, guidd, TimeAdded, ExtraData)
on [Target].id =[Source].id
WHEN NOT MATCHED THEN
INSERT (id, guidd, TimeAdded, ExtraData)
VALUES ([Source].id, [Source].guidd, [Source].TimeAdded, [Source].ExtraData);
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT id, guidd, TimeAdded, ExtraData from #table2
EXCEPT
SELECT id, guidd, TimeAdded, ExtraData from #table1
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT #table2.id, #table2.guidd, #table2.TimeAdded, #table2.ExtraData
FROM #table2
LEFT JOIN #table1 on #table1.id = #table2.id
WHERE #table1.id is null
上記のコードは、あなたが持っているものとは異なるフィールドを使用していますが、さまざまなテクニックの概要を理解できます。
Stack Overflowの元の回答に従って、このコードはここからコピーされたことに注意してください。
とにかく、私のポイントは、 "ベストプラクティス"は、理論だけでなく、実行できることとできないことに帰着します。
- インデックス/キーを正規化して生成できる場合-すばらしい!
- そうでなければ、あなたが私のようなコードハックに頼る手段を持っているなら、うまくいけば上記は助けになるでしょう。
幸運を!
NVARCHAR(64)
コラムプライマリ(したがって:クラスタリング)キー!! まず第一に、それは非常に広い鍵です-最大128バイト。次に、可変サイズです-再度:最適ではありません...これはあなたが持つことができる最悪の選択についてです-あなたのパフォーマンスは地獄であり、テーブルとインデックスの断片化は常に99.9%です....