Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

MERGE INTO Anzeigenauftrag

Ich kann nicht zu dem sprechen, wonach der Fragesteller hier fragt, weil es keinen ergibt Sinn.

Nehmen wir also ein anderes Problem an:

Nehmen wir stattdessen an, dass ich eine Heap-Tabelle ohne Identitätsfeld habe, aber sie hat ein "Besucht " Datumsfeld.
Die Heap-Tabelle protokolliert Webseitenbesuche von Personen und ich lade sie in mein Data Warehouse.
In diesem Data Warehouse möchte ich den Surrogate-Key "WebHitID ", um auf diese Beziehungen zu verweisen.
Lassen Sie uns Merge verwenden, um die Tabelle anfänglich zu laden, und dann weiter aufrufen, um die Tabellen synchron zu halten.

Das weiß ich, wenn ich Datensätze einfüge in eine Tabelle, dann würde ich es vorziehen, dass die IDs (die von einem Identify-Field generiert werden) sequentiell sind, basierend auf dem von mir gewählten Order-By (sagen wir "Visited " Datum).
Es ist nicht ungewöhnlich zu erwarten, dass eine Integer-ID mit dem Zeitpunkt ihrer Erstellung im Verhältnis zu den restlichen Datensätzen in der Tabelle korreliert.
Ich weiß, dass dies nicht immer zu 100 % der Fall ist , aber vergnüge mich für einen Moment.

Dies ist mit Merge möglich.

Mit (was sich wie ein Hack anfühlt ) TOP ermöglicht das Sortieren in unserer Beilage:

MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
    SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
           PWV.PersonID, PWV.WebPageID, PWV.Visited
      FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
     ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
  ON Source.PersonID  = Target.PersonID
 AND Source.WebPageID = Target.WebPageID
 AND Source.Visited   = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
    INSERT (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
    VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
    DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;


Wie Sie sehen, habe ich mich für TOP 9223372036854775807 (die größte ganze Zahl, die es gibt) entschieden, um alles abzurufen.
Wenn Sie die Ressourcen haben, mehr als das zusammenzuführen, sollten Sie es aufteilen.
Während das hier nach „hackiger Problemumgehung schreit "Für mich sollte es Sie dorthin bringen, wo Sie hin müssen.

Ich habe dies an einem kleinen Stichprobensatz getestet und verifiziert, dass es funktioniert. Ich habe die Auswirkungen auf die Leistung bei größeren komplexen Sätzen nicht untersucht Daten aber, also YMMV mit und ohne TOP.