Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

СЛИВАНЕ В ред за вмъкване

Не мога да говоря за това, което Питащият пита тук, защото не прави нищо смисъл.

Така че нека приемем различен проблем:

Да кажем вместо това, че имам Heap-Table без Identity-Field, но има „Посетен " Поле за дата.
Таблицата Heap-Table регистрира посещенията на уеб страницата на човек и аз го зареждам в моето хранилище за данни.
В това хранилище за данни бих искал да използвам сурогатния ключ "WebHitID " за препратка към тези релации.
Нека използваме Merge, за да извършим първоначалното зареждане на таблицата, след което да продължим да го извикваме, за да запазим таблиците в синхрон.

Знам, че ако вмъквам записи в таблица, тогава бих предпочел идентификаторите (които се генерират от Identify-Field) да бъдат последователни въз основа на избраната от мен подредба (да речем „Посетени " Дата).
Не е необичайно да се очаква Integer-ID да корелира с това кога е бил създаден спрямо останалите записи в таблицата.
Знам, че това не винаги е 100% така , но ме усмихнете за момент.

Това е възможно с Обединяване.

Използване (което се чувства като хакване ) TOP ще позволи сортиране в нашата вмъкване:

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


Виждате, че избрах да използвам TOP 9223372036854775807 (най-голямото цяло число), за да изтегля всичко.
Ако имате ресурсите да обедините повече от това, тогава трябва да го разделите на части.
>Докато това крещи „хакерско решение " за мен трябва да ви отведе там, където трябва да отидете.

Тествах това на малък примерен набор и се убедих, че работи. Не съм проучвал въздействието върху производителността върху по-големи сложни набори от данни обаче, така че YMMV със и без ТОП.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възстановяване на проблемната версия на SQL Server?

  2. SQL:Как мога да получа стойността на атрибут в XML тип данни?

  3. Как да преминете през всички SQL таблици?

  4. Има ли начин за достъп до стойността на предишния ред в оператор SELECT?

  5. sql server 2008 management studio не проверява синтаксиса на моята заявка