Mengapa pemicu melakukan pengurangan yang tidak perlu setelah kueri di sql?

Saya punya dua tabel:

  1. Pesan dan
  2. Produk.

Saya ingin kolom tertentu (OnShelfQuantity) di tabel Produk diperbarui saat baris baru ditambahkan di tabel Pesanan. Saya telah menggunakan kueri di bawah ini untuk mengimplementasikan pemicu yang akan melakukan itu. Namun masalahnya ketika saya menyisipkan baris pada tabel Pesanan dan kemudian memeriksa tabel Produk untuk melihat perubahannya, saya melihat bahwa tabel Produk telah diperbarui sebanyak 3 kali. Misal: Jumlah pesanan yang dimasukkan = 10, maka Product_TAB.OnShelfQuantity hanya boleh dikurangi 10. Tapi 30 dikurangi. Tolong bantu!

create trigger dbo.Trigge
ON dbo.Ordertable
AFTER INSERT 
AS
BEGIN
update Product_TAB set OnShelfQuantity= Product_TAB.OnShelfQuantity - Ordertable.Quantity
FROM dbo.Product_TAB
  INNER JOIN Ordertable
  ON Ordertable.ProductID = Product_TAB.ProductID;
END;

person Muhammad Salman Ali    schedule 11.01.2021    source sumber
comment
DBMS mana yang Anda gunakan? (Kode itu khusus untuk produk.)   -  person jarlh    schedule 11.01.2021
comment
@jarth Ini server SQL dan saya menggunakan SSMS untuk mengimplementasikan kodenya.   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
tabel Produk telah diperbarui 3 kali ... jadi apakah Tabel Pesanan memiliki tiga baris untuk ID Produk yang diberikan? Anda mungkin ingin membaca di inserted dan deleted tabel virtual digunakan dalam pemicu.   -  person AlwaysLearning    schedule 11.01.2021
comment
Pemicu ini mungkin paling baik diterapkan dengan tampilan yang diindeks   -  person Charlieface    schedule 11.01.2021
comment
@SelaluBelajar Terima kasih banyak!   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
@Charlieface Terima kasih banyak!   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
Apakah Anda ingin penerapan untuk pertanyaan Anda?   -  person Charlieface    schedule 11.01.2021


Jawaban (3)


Menurut saya, Anda dapat menggunakan tabel INSERTED untuk mengatasi Masalah ini.

Tabel yang disisipkan adalah tabel yang digunakan oleh pemicu untuk menyimpan catatan yang sering disisipkan dalam tabel.

Jadi, Anda dapat menggunakan hal yang sama dalam pernyataan pembaruan Anda untuk menghindari hal ini.

update Product_TAB set OnShelfQuantity= Product_TAB.OnShelfQuantity - 
Ordertable.Quantity
FROM dbo.Product_TAB
INNER JOIN Ordertable  ON Ordertable.ProductID = Product_TAB.ProductID
INNER JOIN inserted INS ON INS.Order_ID=Ordertable.Order_ID
person Thiyagu    schedule 11.01.2021
comment
Tidak ada alasan untuk bergabung ke tabel pesanan - semua yang Anda perlukan darinya ada di tabel yang disisipkan dalam pemicu SETELAH. - person SMor; 11.01.2021

Anda dapat memiliki beberapa baris di tabel inserted. Dan, baris ini dapat memiliki produk yang sama. Sebuah baris dalam tabel target hanya diperbarui sekali dalam pernyataan update. Oleh karena itu, Anda ingin menggabungkan data sebelum update:

create trigger dbo.Trigge
ON dbo.Ordertable
AFTER INSERT 
AS
BEGIN    
    update p
        set OnShelfQuantity= p.OnShelfQuantity - i.total_quantity
        from dbo.Product_TAB p JOIN
             (SELECT i.ProductId, SUM(i.Quantity) as total_quantity
              FROM inserted i
              GROUP BY i.ProductId
             ) i
             on i.ProductID = p.ProductID;
END;

Perhatikan bahwa ini hanya menggunakan inserted dan bukan tabel aslinya.

person Gordon Linoff    schedule 11.01.2021

Jadi masalahnya adalah saya memasukkan baris baru tetapi dengan ID Pesanan yang sama. Inilah mengapa ia melakukan pengurangan tambahan yang tidak saya perlukan. Jadi sekarang saya tinggal menyisipkan baris baru tetapi dengan OrderID yang unik. Terima kasih kepada semua orang yang menjawab di atas!

person Muhammad Salman Ali    schedule 11.01.2021