Mengemaskini Rekod Jadual Menggunakan CTE dengan Cekap
Artikel ini menerangkan cara mengemas kini rekod jadual dengan betul menggunakan Common Table Expression (CTE) untuk mengira nilai baharu. Matlamatnya adalah untuk mengemas kini lajur DocTotal
dalam jadual PEDI_InvoiceDetail
dengan jumlah yang dikira semula. Percubaan sebelumnya gagal kerana kemas kini kepada CTE tidak disebarkan ke jadual asas.
Cabarannya
Mengemas kini jadual secara langsung berdasarkan nilai pengiraan CTE selalunya membawa kepada ralat. CTE bertindak sebagai set hasil sementara; perubahan di dalamnya tidak mengemas kini jadual asas secara automatik.
Penyelesaian
Penyelesaian melibatkan proses dua langkah menggunakan CTE:
<code class="language-sql">;WITH T AS ( SELECT InvoiceNumber, DocTotal, SUM(Sale + VAT) OVER (PARTITION BY InvoiceNumber) AS NewDocTotal FROM PEDI_InvoiceDetail ) UPDATE T SET DocTotal = NewDocTotal;</code>
Pertanyaan yang disemak ini:
Mencipta CTE: CTE T
memilih InvoiceNumber
, yang asal DocTotal
dan mengira DocTotal
(NewDocTotal
) baharu menggunakan fungsi SUM() OVER (PARTITION BY InvoiceNumber)
. Ini dengan cekap mengagregatkan Sale VAT
untuk setiap InvoiceNumber
unik.
Mengemas kini Jadual Asas: Pernyataan UPDATE
kemudian secara langsung menyasarkan CTE T
, menetapkan DocTotal
asal kepada NewDocTotal
yang baru dikira. Ini memastikan perubahan digunakan pada jadual PEDI_InvoiceDetail
.
Konsep Utama
OVER (PARTITION BY ...)
: Klausa penting ini membahagikan data dengan InvoiceNumber
, membenarkan fungsi SUM()
mengira jumlah bagi setiap invois secara berasingan.Pendekatan ini menyediakan kaedah yang bersih dan cekap untuk mengemas kini rekod dengan nilai terkira yang diperoleh daripada CTE, mengelakkan perangkap biasa cuba mengubah suai CTE itu sendiri.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Kemas Kini Rekod Jadual dengan Nilai Dikira daripada CTE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!