私は1つのDBから別のデータベースにCRUDする必要があるシステム統合プロジェクトを持っています。特に複雑ではありません。しかし、ターゲットには存在するがソースにはない行を削除する場合は、少し問題に遭遇しました。標準パターンにはLEFT JOIN、NOT EXISTSまたはNOT INがあります。私はLEFT JOINを選んだ。私の「Phone」テーブルは複合キー、Employee 'Id'、PhoneType:Work、Home、Mobileなどを使用します。標準の左結合により、ソースにないターゲット電話番号はすべて削除されます。これはテーブル全体をクリアします。 注:最終更新以降に変更されたレコードのみを更新します。ターゲット全体ではなく、&ソースです。だから、私は本当に貧しいSQLで私が疑う修正書いた:これは動作しますコンポジットキーではないところでSQLを削除する
-- SOURCE
DECLARE @tmpPhones TABLE(Id varchar(8), PhoneType int, PhoneNumber varchar(30), PRIMARY KEY (Id, PhoneType))
INSERT into @tmpPhones values
('TEST123', 1, '12345678'),
('TEST123', 2, '12345678'),
('TEST123', 3, '12345678')
-- TARGET
[email protected] TABLE(Id varchar(8), PhoneType int, PhoneNumber varchar(30), PRIMARY KEY (Id, PhoneType))
INSERT into @Phone values
('TEST123', 1, '12345678'), <-- Exists in both, leave
('TEST123', 2, '12345678'), <-- Exists in both, leave
('TEST123', 3, '12345678'), <-- Exists in both, leave
('TEST123', 4, '12345678'), <-- ONLY delete this one!
('TEST456', 2, '12345678'), <-- Ignore this employee Id
('TEST456', 3, '12345678'), ""
('TEST456', 4, '12345678') ""
DELETE p
FROM @Phone p
LEFT JOIN @tmpPhones t
ON t.Id = p.Id AND t.PhoneType = p.PhoneType
WHERE t.Id IS NULL AND t.PhoneType IS NULL
AND p.Id IN (SELECT Id FROM @tmpPhones) <-- a sad hack?
を、私たちはこれだけの従業員ではなく、他のすべてのレコードを削除していることを確認するためのより良い方法があるような気がします。
提案がありますか?
はこのSQL Serverですか? – Nikki9696
はい、SQL Server 2012. –
LEFT JOINは完全に間違っています – wildplasser