Frage

Ich habe eine Tabelle, die nur zwei Spalten hält - eine ListID und PersonID. Wenn eine Person mit einem anderen im System zusammengeführt wird, war ich alle Einträge aus der „Quelle“ Person zu aktualisieren Verweise auf den „Ziel“ Menschen zu sein.

Im Idealfall würde Ich mag einfach, etwas nennen wie

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

Wenn jedoch die Zielperson bereits in dieser Tabelle mit dem gleichen ListID als Quelle Person vorhanden ist, wird ein doppelter Eintrag vorgenommen werden. Wie kann ich führe diese Aktion ohne duplizierte Einträge erstellen? (ListID, PersonID ist der Primärschlüssel)

EDIT: Mehrere ListIDs verwendet. Wenn SourcePerson zu ListIDs zugeordnet ist 1, 2, und 3 und DestinationPerson zugeordnet ist ListIDs 3 und 4, dann das Endergebnis muss vier Reihen haben -. DestinationPerson zu ListID zugewiesen 1, 2, 3 und 4

War es hilfreich?

Lösung

--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

Andere Tipps

Als erstes sollten Sie destperson für alle Listen abonnieren, die SourcePerson zu dieser Destperson gezeichnet wird, ist nicht bereits subscibed. Dann löschen Sie alle SourcePersons Abonnements. Dies wird mit mehreren ListIDs arbeiten.

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

Ich habe hier mit David B zu vereinbaren. Entfernen Sie alle älteren Sachen, die nicht da sein sollte und dann tun Sie Update.

Eigentlich

, ich glaube, Sie sollten Ihr Datenbank-Design zurück und überdenken, wie man wirklich nicht in Umständen sein sollte, wo Sie den Primärschlüssel für einen Datensatz sind zu ändern, wie Sie vorschlagen zu tun - es bedeutet, dass die PersonID Spalte nicht wirklich ein geeigneter Primärschlüssel in dem ersten Platz ist.

Meine Vermutung ist Ihre PersonID an die Benutzer ausgesetzt ist, haben sie ihre Datenbank aus irgendeinem Grund neu nummeriert und Sie die Änderung sind die Synchronisierung wieder in. Dies ist im Allgemeinen eine schlechte Idee, da es Prüfprotokolle und zeitliche Konsistenz bricht. Unter diesen Umständen ist es im Allgemeinen besser Sie Ihre eigenen sich nicht ändernden Primärschlüssel zu verwenden - in der Regel eine Identität - und die PersonID einrichten, dass die Benutzer als ein Attribut, dass zu sehen. Es ist zusätzliche Arbeit, sondern gibt Ihnen zusätzliche Konsistenz und Robustheit auf lange Sicht.

Eine gute Faustregel ist der Primärschlüssel eines Datensatzes nicht an die Benutzer ausgesetzt werden sollten, wenn möglich, und nur so nach reiflicher Überlegung tun sollten. OK, ich bekenne, das selbst bei zahlreichen Gelegenheiten zu brechen, aber es ist erstrebenswert, wo man :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top