Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Scalanie z zamówieniem reklamowym

Nie mogę mówić, o co pyta Pytający, ponieważ nie powoduje to żadnego sens.

Załóżmy więc inny problem:

Załóżmy zamiast tego, że mam tabelę stosu bez pola tożsamości, ale ma ona „Odwiedzone " Pole daty.
Tabela sterty rejestruje odwiedziny strony internetowej osoby i ładuję ją do mojej hurtowni danych.
W tej hurtowni danych chciałbym użyć klucza zastępczego "WebHitID ", aby odwołać się do tych relacji.
Użyjmy funkcji scalania do wstępnego załadowania tabeli, a następnie kontynuuj jej wywoływanie, aby zachować synchronizację tabel.

Wiem, że jeśli wstawiam rekordy do tabeli, wolałbym, aby identyfikatory (które są generowane przez pole identyfikacyjne) były sekwencyjne na podstawie wybranego przeze mnie zamówienia (powiedzmy, że „Odwiedzone " Data).
Nierzadko można oczekiwać, że identyfikator całkowity będzie skorelowany z datą utworzenia w stosunku do pozostałych rekordów w tabeli.
Wiem, że nie zawsze tak jest w 100% , ale pociesz mnie przez chwilę.

Jest to możliwe dzięki połączeniu.

Używanie (co wydaje się hakiem ) TOP umożliwi sortowanie w naszej wstawce:

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


Widać, że zdecydowałem się użyć TOP 9223372036854775807 (największej liczby całkowitej), aby wyciągnąć wszystko.
Jeśli masz zasoby, aby scalić więcej niż to, powinieneś to zrobić.
Kiedy to krzyczy „hackowe obejście " według mnie powinno to doprowadzić Cię tam, gdzie chcesz.

Przetestowałem to na małym zestawie próbek i zweryfikowałem, że działa.Nie badałem wpływu na wydajność w przypadku większych złożonych zestawów jednak dane, więc YMMV z TOP i bez.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEADD(MIESIĄC, DATEDIFF(MIESIĄC, 0, GETDATE()), 0) Czy ktoś może mi to wyjaśnić

  2. Jak kontrolować wartość null w SELECT INTO dla kolumn opartych na literałach?

  3. Obliczanie dni do wyłączenia weekendów (od poniedziałku do piątku) w SQL Server

  4. Czy mogę uzyskać nazwy wszystkich tabel bazy danych SQL Server w aplikacji C#?

  5. Jak uzyskać dolne 50% zapytania wybierającego na serwerze SQL?