VARSA ve BİRLEŞTİRME Deyimi

0

Soru

Birden fazla tablodan bir tabloya akan verilerim var diyelim: Table_A Sonra tablo A'dan veri alan ve Tablo B ile birleştiren bir Birleştirme saklı proc var.

Ancak, bir şey doğru görünmüyor. Eğer kesecek olursam ve iyi çalışıyor verileri yüklemek, ama eğer kesecek ve yük değilsin ve sadece eachh saat sorgu getirme hata iletisini diyerek alıyorum

Msg 8672, Düzey 16, Durum 1, Yordam Merge_Table_A, Satır 4 [Toplu İş Başlangıç Satırı 0] BİRLEŞTİRME deyimi, aynı satırı birden çok kez güncelleştirmeye veya silmeye çalıştı. Bu, hedef satır birden fazla kaynak satırla eşleştiğinde gerçekleşir. BİRLEŞTİRME deyimi, hedef tablonun aynı satırını birden çok kez güncelleştiremez/silemez. Hedef satırın en fazla bir kaynak satırla eşleştiğinden emin olmak için ON yan tümcesini daraltın veya kaynak satırları gruplamak için GROUP BY yan tümcesini kullanın.

Bunu nasıl aşabilirler?

Verileri aşamalı olarak yükleyebilmek ve kesik yükler yapmamak istiyorum, ancak aynı zamanda satırın zaten var olup olmadığını güncelleyen veya ekleyen veya umursamayan depolanmış bir proc var.

azure sql-merge sql-server
2021-11-24 01:52:34
1

En iyi cevabı

1

Hedef tablonuzda önceki çalışmalarınızdan yüklenen yinelenen satırlar var gibi görünüyor.

Not: Birleştirmede Eşleştirme, Birleştirmenin kendisini çalıştırırken eklenen satırları (hatta çoğaltmayı) dikkate almaz.

Aşağıda örnek verilerle repro örneğim var:

Tablo1: Başlangıç verileri

enter image description here

Tablo2: Taget tablosu

enter image description here

Birleştirme Deyimi:

MERGE tb2 AS Target
USING tb1   AS Source
 ON Source.firstname = Target.firstname and 
    Source.lastname = Target.lastname 

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (firstname, lastname, updated_date) 
VALUES (Source.firstname, Source.lastname, source.updated_date)

-- For Updates
WHEN MATCHED THEN UPDATE SET
   Target.updated_date      = Source.updated_date

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE;

Birleştirme yürütüldüğünde, tüm verileri hatasız ekler.

enter image description here

Tb1'deki yeni veriler:

enter image description here

Birleştirme deyimini çalıştırdığımda, sizinkiyle aynı hatayı veriyor.

enter image description here

Aşağıdaki seçeneklerden birini kullanarak geçici bir çözüm olarak,

  1. Verileri benzersiz olarak tanımlamak için ON yan tümcesinde mümkünse ek koşullar ekleyin.

  2. Kopyaları kaynaktan kaldırın ve verileri aşağıdaki gibi tb2'ye birleştirin.

     --temp table
     drop table if exists #tb1;
    
     select *  into #tb1 from (
         select *, row_number() over(partition by firstname, lastname order by firstname, lastname, updated_date desc) as rn from tb1) a
     where rn = 1 
    
     MERGE tb2 AS Target
     USING #tb1 AS Source
      ON Source.firstname = Target.firstname and 
         Source.lastname = Target.lastname 
    
     -- For Inserts
     WHEN NOT MATCHED BY Target THEN
     INSERT (firstname, lastname, updated_date) 
       VALUES (Source.firstname, Source.lastname, source.updated_date)
    
     -- For Updates
     WHEN MATCHED THEN UPDATE SET
        Target.updated_date     = Source.updated_date
    
     -- For Deletes
     WHEN NOT MATCHED BY Source THEN
       DELETE;
    

Veriler tb2'ye başarıyla birleştirildi.

enter image description here

2021-12-02 12:52:40

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................