1

ListID と PersonID の 2 つの列のみを保持するテーブルがあります。システム内で人物が別の人物とマージされると、「ソース」人物からのすべての参照を「宛先」人物への参照になるように更新する必要がありました。

理想的には、次のような単純なものを呼び出したい

UPDATE MailingListSubscription
SET PersonID = @DestPerson
WHERE PersonID = @SourcePerson

ただし、送信元の人物と同じ ListID を持つ送信先の人物がこのテーブルに既に存在する場合は、重複したエントリが作成されます。重複したエントリを作成せずにこのアクションを実行するにはどうすればよいですか? (ListID、PersonID が主キー)

編集: 複数の ListID が使用されます。SourcePerson が ListID 1、2、および 3 に割り当てられ、DestinationPerson が ListID 3 および 4 に割り当てられている場合、最終結果には 4 つの行 (ListID 1、2、3、および 4 に割り当てられた DestinationPerson) が必要です。

4

4 に答える 4

3
--out with the bad
DELETE
FROM MailingListSubscription
WHERE PersonId = @SourcePerson
  and ListID in (SELECT ListID FROM MailingListSubscription WHERE PersonID = @DestPerson)

--update the rest (good)
UPDATE MailingListSubscription
SET PersonId = @DestPerson
WHERE PersonId = @SourcePerson
于 2008-09-25T19:00:42.003 に答える
0

最初に、SourcePerson が購読していて、Destperson がまだ購読していないすべてのリストに destperson を購読する必要があります。次に、すべての SourcePersons サブスクリプションを削除します。これは、複数の ListID で機能します。

Insert into MailingListSubscription
(
   ListID,
   PersonID
)
Select
   ListID,
   @DestPerson
From
   MailingListSubscription as t1
Where
   PersonID = @SourcePerson and
   Not Exists
   (
      Select *
      From MailingListSubscription as t2
      Where
         PersonID = @DestPerson and
         t1.ListID = t2.ListID
   )



Delete From MailingListSubscription
Where
   PersonID = @SourcePerson
于 2008-09-25T19:52:13.113 に答える
0

I have to agree with David B here. Remove all the older stuff that shouldn't be there and then do your update.

于 2008-09-25T19:08:39.503 に答える
0

実際、あなたが提案しているようにレコードの主キーを変更している状況では本当にすべきではないので、戻ってデータベースの設計を再考する必要があると思います-それは PersonID 列が実際にはそうではないことを意味しますそもそも適切な主キー。

私の推測では、PersonID がユーザーに公開されており、何らかの理由でデータベースの番号が付け直されており、変更を同期し直しています。これは、監査証跡と一時的な一貫性が損なわれるため、一般的にはお勧めできません。このような状況では、一般に、変更されない独自の主キー (通常は ID) を使用し、その属性としてユーザーに表示される PersonID を設定することをお勧めします。これは余分な作業ですが、長期的には一貫性と堅牢性が向上します。

経験則として、レコードの主キーは可能な限りユーザーに公開すべきではなく、慎重に検討した後にのみ公開する必要があります。OK、私は何度もこれを自分で破ったことを告白しますが、できる限り努力する価値があります:-)

于 2008-09-25T19:12:59.260 に答える