sql >> Databáze >  >> RDS >> Sqlserver

SLOUČIT DO objednávky

Nemohu mluvit s tím, co zde tazatel požaduje, protože to žádné nedělá smysl.

Předpokládejme tedy jiný problém:

Řekněme místo toho, že mám tabulku Heap-Table bez pole identity, ale má "Navštíveno " Pole Datum.
Hromadná tabulka zaznamenává návštěvy webové stránky osoby a já ji načítám do svého datového skladu.
V tomto datovém skladu bych chtěl použít náhradní klíč "WebHitID ", abyste na tyto vztahy odkazovali.
Pojďme použít Merge k provedení počátečního načtení tabulky, pak pokračujte v jejím volání, aby byly tabulky synchronizované.

Vím, že když vkládám záznamy do tabulky, pak bych upřednostnil, aby ID (která jsou generována polem Identify-Field) byla sekvenční na základě jakéhokoli Order-By, který zvolím (řekněme „Navštívené " Datum).
Není neobvyklé očekávat, že Integer-ID bude korelovat s tím, kdy bylo vytvořeno, vzhledem ke zbytku záznamů v tabulce.
Vím, že to není vždy 100% případ , ale na chvíli mě pobavte.

To je možné pomocí Merge.

Použití (což vypadá jako hack ) TOP umožní řazení v naší příloze:

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


Vidíte, že jsem se rozhodl použít TOP 9223372036854775807 (největší celé číslo, které existuje) k vytažení všeho.
Pokud máte prostředky na sloučení více, pak byste to měli rozkouskovat.
Zatímco toto křičí „hacky workaround "Podle mě by vás to mělo dostat tam, kam potřebujete.

Testoval jsem to na malé vzorové sadě a ověřil jsem, že to funguje. Nestudoval jsem dopad na výkon na větších komplexních sadách data, takže YMMV s a bez TOP.



  1. Použití zdroje Postgresql JDBC s Apache Spark na EMR

  2. Codeigniter:Jak nastavit připojení k serveru SQL (2008)

  3. jak zajistit, aby záznam byl vždy nahoře v dané sadě výsledků v mysql?

  4. 4 Předdefinované metody konverze dat SQL a případy použití