sql >> Databasteknik >  >> RDS >> Sqlserver

SLUT TILL insättningsordning

Jag kan inte tala till det som frågeställaren frågar efter här eftersom det inte gör någon mening.

Så låt oss anta ett annat problem:

Låt oss istället säga att jag har en heap-tabell utan identitetsfält, men den har en "Besökt " Datumfält.
Heap-Table loggar personwebbsidan som besöks och jag laddar in den i mitt datalager.
I detta datalager skulle jag vilja använda surrogatnyckeln "WebHitID " för att referera till dessa relationer.
Låt oss använda Merge för att göra den initiala laddningen av tabellen, och fortsätt sedan anropa den för att hålla tabellerna synkroniserade.

Jag vet att om jag infogar poster i en tabell, då skulle jag föredra att ID:n (som genereras av ett identifieringsfält) är sekventiellt baserat på vilken Order-By jag än väljer (låt oss säga "Besökt " Date).
Det är inte ovanligt att förvänta sig att ett heltals-ID korrelerar till när det skapades i förhållande till resten av posterna i tabellen.
Jag vet att detta inte alltid är 100 % fallet , men humor mig ett ögonblick.

Detta är möjligt med Merge.

Använder (vad som känns som ett hack ) TOP tillåter sortering i vår infoga:

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


Du kan se att jag valde att använda TOP 9223372036854775807 (det största heltal som finns) för att dra allt.
Om du har resurserna att slå samman mer än så bör du ta bort det.
Medan det här skriker "hackig lösning " För mig borde det ta dig dit du behöver gå.

Jag har testat detta på en liten provuppsättning och verifierat att den fungerar. Jag har inte studerat prestandans inverkan på större komplexa uppsättningar av data dock, så YMMV med och utan TOPPEN.



  1. Hur man kontrollerar MySQL-versionen

  2. Beräkna exakt månadsskillnad mellan två datum

  3. Är tabellnamn i MySQL skiftlägeskänsliga?

  4. Distribuera SQL Server AlwaysOn Availability Groups på Linux