sql >> Database teknologi >  >> RDS >> Sqlserver

FLET TIL indsættelsesrækkefølge

Jeg kan ikke tale med det, som spørger beder om her, fordi det ikke giver noget forstand.

Så lad os antage et andet problem:

Lad os i stedet sige, at jeg har en heap-tabel uden identitetsfelt, men den har en "Besøgt " Dato felt.
Heap-tabellen logger personwebsidebesøg, og jeg indlæser den i mit datavarehus.
I dette datavarehus vil jeg gerne bruge surrogat-nøglen "WebHitID " for at referere til disse relationer.
Lad os bruge Merge til at udføre den første indlæsning af tabellen, og fortsæt derefter med at kalde den for at holde tabellerne synkroniseret.

Jeg ved, at hvis jeg indsætter poster ind i en tabel, så ville jeg foretrække, at ID'erne (der bliver genereret af et Identify-Field) er sekventielle baseret på hvilken som helst Order-By jeg vælger (lad os sige "Besøgt " Dato).
Det er ikke ualmindeligt at forvente, at et heltals-ID korrelerer med, hvornår det blev oprettet i forhold til resten af ​​posterne i tabellen.
Jeg ved, at dette ikke altid er 100 % tilfældet , men humor mig et øjeblik.

Dette er muligt med Merge.

Brug af (hvad der føles som et hack ) TOP giver mulighed for sortering i vores Indsæt:

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, at jeg valgte at bruge TOP 9223372036854775807 (det største heltal, der findes) til at trække alt.
Hvis du har ressourcerne til at fusionere mere end det, så burde du lægge det ud.
Mens dette skriger "hacky workaround " for mig burde det bringe dig derhen, hvor du skal hen.

Jeg har testet dette på et lille prøvesæt og bekræftet, at det virker. Jeg har ikke undersøgt virkningen af ​​dets ydeevne på større komplekse sæt af data dog, så YMMV med og uden TOP.



  1. Hvordan indsætter man værdier i et PHP-array til en MySQL-tabel?

  2. Forskellen mellem TRIM() og TRIM_ORACLE() i MariaDB

  3. Sådan fjernforbindelse til en MySQL-database placeret på vores delte server

  4. % log ind i Javas PreparedStatement