Saya memiliki tabel temp #A yang berisi:

ID        RevID     Designation      ParentID     Amount
--------------------------------------------------------    
100       500       Test1            300          5000
250       500       Test2            360          5000
410       500       Test3            580          5000

Saya juga memiliki tabel temp #B yang berisi:

ID        RevID     Text        Amount
--------------------------------------  
900       500       Test100      6500

Apa yang saya coba lakukan adalah memasukkan apa yang ada di tabel #B tanpa menduplikasi baris karena gabungan kiri berdasarkan RevID. Saya hanya peduli membawa RevID dan Jumlah dari tabel #B ke baris baru di tabel #A, dan menjaga kolom lainnya sama dengan baris mana pun dengan RevID yang cocok dari tabel #A.

Saya mencoba memasukkan ke dalam tabel ini dengan melakukan:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
    SELECT DISTINCT
        a.ID,
        a.RevID,
        b.Text,
        a.ParentID,
        b.Amount
    FROM 
        #B b
    LEFT JOIN
        #A a ON b.RevID = a.RevID

Hasil ideal saya adalah sebagai berikut di mana ia menambahkan satu baris dari tabel #B ke tabel #A tanpa menambahkannya tiga kali karena tiga baris dari tabel #A dengan RevID yang sama:

ID        RevID     Designation      ParentID     Amount

100       500       Test1            300          5000
250       500       Test2            360          5000
410       500       Test3            580          5000
100       500       Test100          300          6500

Saya rasa saya tidak bisa menggunakan union karena tabel #A mungkin berisi RevID lain dan juga tabel #B tidak berisi kolom yang sama dengan tabel #A jadi saya harus bergabung dengan tabel #B dan di mana ada RevID yang cocok, hanya membawa baris itu dari tabel #B ke tabel #A sekali.

0
jwalls91 11 Mei 2021, 20:56

3 jawaban

Jawaban Terbaik

Ini dapat dilakukan dengan mudah menggunakan cross apply untuk memilih satu baris yang cocok:

insert into #a (Id, RevId, Designation, ParentId, Amount)
select a.Id, a.RevId, b.[Text], a.ParentId, b.Amount
from #b b
cross apply (
    select top(1) a.Id, a.RevId, a.ParentId
    from #a a
    where a.RevId=b.RevId
    order by a.Id
)a
1
Stu 11 Mei 2021, 20:10

Mempertimbangkan bahwa Anda hanya peduli tentang menambahkan kolom RevID dan Jumlah yang berbeda dari #B ke #A di mana kolom yang tersisa tidak penting, Anda dapat mencoba mengikuti kueri dan memeriksa apakah memenuhi semua kondisi Anda,

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
SELECT (SELECT TOP 1 #A.ID FROM #A) ID, a.RevID,(SELECT TOP 1 #A.Designation FROM #A) Designation,(SELECT TOP 1 #A.ParentID FROM #A) ParentID,b.Amount FROM  #B b JOIN #A a ON b.RevID = a.RevID
EXCEPT
SELECT (SELECT TOP 1 #A.ID FROM #A) ID,RevID,(SELECT TOP 1 #A.Designation FROM #A) Designation,(SELECT TOP 1 #A.ParentID FROM #A) ParentID,Amount FROM #A

Menggunakan KECUALI akan menghindari baris yang sudah ada di #A dan kami akan mendapatkan baris unik untuk kueri penyisipan.

Silakan lihat DB Fiddle dengan lebih banyak contoh data: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=de51af

1
Abhijeet Khandagale 11 Mei 2021, 20:17

Anda dapat melakukan sesuatu seperti:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
 SELECT
  (SELECT TOP 1 id FROM #A a WHERE a.RevId = b.RevId),
  b.RevID,
  b.Text,
  (SELECT TOP 1 ParentId FROM #A a WHERE a.RevId = b.RevId)
  b.Amount
 FROM 
  #B b

Itu tidak cantik, tapi saya pikir itu mengikuti deskripsi Anda dengan sangat logis. Dapatkan baris dari B dan pertahankan "kolom lainnya sama dengan baris mana pun dengan RevID yang cocok dari tabel #A"

Atau, saya mungkin menyarankan:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
 SELECT
  a.ID,
  a.RevID,
  b.Text,
  a.ParentID,
  b.Amount
 FROM 
  #B b
  LEFT JOIN
  (
   SELECT a.RevId, MAX(a.ID) ID, MAX(a.ParentID) ParentID
   FROM #A a
   GROUP BY RevId
  ) a ON b.RevID = a.RevID

Kueri dalam mendapatkan satu baris per RevId dari #A dengan ID arbitrer dan ParentID. Itu dapat digabungkan dengan #B tanpa membuat duplikat.

1
EdmCoff 11 Mei 2021, 19:43