重複するキーアップデートの質問について
-
16-10-2019 - |
質問
2つのシステムからのデータを比較しようとしています。基本的なアイデアは次のとおりです。
- 温度テーブルを作成します。
- Table1データを挿入します。
- 一意のIDを尊重するテーブル2データ(リンクされたリモートサーバー)を挿入します。
- 最初または2番目のテーブルには異なる情報がある場合、フィルター。
2番目のシステムから挿入、および複製の場合は代わりに更新する2番目の挿入セットを取得しようとしています。私はそれを正しく理解できないようです。最終挿入のために、私は何を持っているべきですか?
Table2データが挿入されていないため、「フィルターパーツ」はありません。フィルター部分には、2つのシステム間でアクティブ、最後の名前、または名が異なる行が表示されます。単純 where Table1LastName <> Table2LastName
タイプステートメント。
注:2つの温度テーブルが作成されている...と完全な外側の結合と「ID IS NULL」を使用して、これが機能しています。私はこれを以前に使用したことのない方法で機能させようとしています。
if object_id('tempdb..#CompareDrs') is not null
drop table #CompareDrs;
GO
create table #CompareDrs
(
ID varchar(20) unique
,TABLE1Active varchar(1)
,TABLE1LastName varchar(50)
,TABLE1FirstName varchar(50)
,TABLE2Active varchar(1)
,TABLE2LastName varchar(50)
,TABLE2FirstName varchar(50)
);
GO
INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
SELECT
right('00000000000000000000' + ForeignID, 20) ID
,case when Active = 0 then 'I'
when Active = 1 then 'A'
else ' '
end TABLE1Active
,LastName TABLE1LastName
,FirstName TABLE1FirstName
FROM
[DATABASE1].dbo.DRs
Order By
ID;
GO
INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
SELECT
right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
,DRAFLG TABLE2Active
,DRLNAM TABLE2LastName
,DR1NAM TABLE2FirstName
FROM
[LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active),
TABLE2LastName = VALUES(TABLE2LastName),
TABLE2FirstName = VALUES(TABLE2FirstName),
GO
SELECT * FROM #CompareDrs;
解決
SQL 2008を使用している場合は、をご覧ください マージ ステートメント、それは他のプラットフォームがupsertと呼ぶものを実行し、存在する場合は更新し、それ以外の場合は挿入できます。
他のヒント
最初の挿入からTEMPテーブルに挿入されたIDをキャプチャするSelectステートメントを書くことができます。
次に、以前のSELETステートメントにIDが含まれていない限り、2番目のテーブルから挿入するだけです。 elseステートメントを使用して、他の行を更新として実装する
2つのテーブルから別のテーブルの1つの行に一致する行を置いているようです。
その場合、あなたはする必要があります
- 最初のテーブルから列を挿入します
- ID番号が一致する2番目のテーブルから、他の列がnullである2番目のテーブルから他の列を更新します。
2つのテーブルのID番号が一致することは完全には明らかではないので、私はそれについて間違っている可能性があります。
所属していません dba.stackexchange