Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

GABUNG KE DALAM urutan penyisipan

Saya tidak dapat berbicara dengan apa yang diminta Penanya di sini karena tidak membuat apa pun akal.

Jadi, mari kita asumsikan masalah yang berbeda:

Katakanlah, sebagai gantinya, saya memiliki Heap-Table tanpa Identity-Field, tetapi memiliki "Dikunjungi " Bidang tanggal.
The Heap-Table mencatat Kunjungan Halaman Web Orang dan saya memuatnya ke Gudang Data saya.
Di Gudang Data ini saya ingin menggunakan Kunci Pengganti "WebHitID " untuk mereferensikan hubungan ini.
Mari kita gunakan Merge untuk melakukan pemuatan awal tabel, lalu lanjutkan memanggilnya untuk menjaga agar tabel tetap sinkron.

Saya tahu bahwa jika saya memasukkan catatan ke dalam tabel, maka saya lebih suka ID (yang dihasilkan oleh Identifikasi-Field) untuk menjadi berurutan berdasarkan Order-By apa pun yang saya pilih (katakanlah "Dikunjungi " Tanggal).
Tidak jarang mengharapkan Integer-ID berkorelasi dengan saat dibuat relatif terhadap catatan lainnya dalam tabel.
Saya tahu ini tidak selalu 100% terjadi , tapi menghiburku sebentar.

Hal ini dimungkinkan dengan Gabung.

Menggunakan (yang terasa seperti retas ) TOP akan memungkinkan Penyortiran di Sisipan kami:

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


Anda dapat melihat saya memilih untuk menggunakan TOP 9223372036854775807 (Bilangan Bulat terbesar yang ada) untuk menarik semuanya.
Jika Anda memiliki sumber daya untuk menggabungkan lebih dari itu, maka Anda harus memotongnya.
Sementara ini berteriak "solusi hacky " bagi saya, ini akan membawa Anda ke tempat yang Anda tuju.

Saya telah menguji ini pada kumpulan sampel kecil dan memverifikasinya berfungsi. Saya belum mempelajari dampak kinerjanya pada kumpulan kompleks yang lebih besar data, jadi YMMV dengan dan tanpa TOP.



  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 Resumable Index:Apakah ini baik untuk Anda?

  2. Peningkatan Platform Data SQL Server pada tahun 2015

  3. identitas dari sql insert melalui jdbctemplate

  4. Alternatif fungsi lead lag di SQL Server 2008

  5. Mengapa menggunakan klausa INCLUDE saat membuat indeks?