Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Kemas Kini Rekod Jadual Menggunakan Nilai Dikira dalam Ungkapan Jadual Biasa (CTE)?

Bagaimanakah Saya Boleh Kemas Kini Rekod Jadual Menggunakan Nilai Dikira dalam Ungkapan Jadual Biasa (CTE)?

Susan Sarandon
Susan Sarandonasal
2025-01-08 14:36:41183semak imbas

How Can I Update Table Records Using Values Calculated in a Common Table Expression (CTE)?

Kemas kini rekod menggunakan ungkapan biasa (CTE)

Apabila menggunakan CTE untuk mengemas kini rekod jadual, pastikan anda memberi perhatian kepada sifat CTE. CTE ialah koleksi sementara yang wujud hanya semasa pertanyaan yang ditakrifkan. Oleh itu, sebarang perubahan yang dibuat pada CTE tidak akan menjejaskan jadual sumber secara langsung.

Untuk mengatasi had ini, pendekatan berbeza diperlukan untuk mengemas kini rekod berdasarkan CTE. Pendekatan yang cekap ialah mencipta subkueri dalam CTE untuk mengira nilai yang diperlukan. Subquery ini kemudiannya boleh digunakan dalam pernyataan KEMASKINI untuk menggunakan nilai yang dikira pada jadual sasaran.

Pertimbangkan contoh berikut di mana anda ingin mengemas kini lajur PEDI_InvoiceDetail dalam jadual DocTotal berdasarkan nilai yang dikira dalam CTE:

<code class="language-sql">;WITH CTE_DocTotal AS
(
  SELECT InvoiceNumber, SUM(Sale + VAT) AS DocTotal
  FROM PEDI_InvoiceDetail
  GROUP BY InvoiceNumber
)</code>

CTE ini mengira InvoiceNumber untuk setiap DocTotal dan menyimpan hasilnya dalam koleksi sementara. Untuk mengemas kini jadual PEDI_InvoiceDetail dengan nilai ini, anda boleh menggunakan subkueri dalam CTE:

<code class="language-sql">;WITH T AS
(
  SELECT InvoiceNumber,
          SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
  FROM PEDI_InvoiceDetail
)
UPDATE T
SET DocTotal = NewDocTotal</code>

Dalam subkueri ini, fungsi OVER dengan klausa SUM() mengira InvoiceNumber baharu untuk setiap partition (kumpulan) yang ditakrifkan oleh DocTotal. Subkueri ini kemudiannya dialiaskan kepada T dan digunakan dalam pernyataan KEMASKINI untuk mengemas kini lajur DocTotal dengan nilai yang dikira.

Dengan pendekatan ini, anda boleh mengemas kini rekod dengan berkesan dalam jadual PEDI_InvoiceDetail berdasarkan nilai yang dikira dalam CTE, memastikan perubahan itu berterusan dalam jadual sumber.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Kemas Kini Rekod Jadual Menggunakan Nilai Dikira dalam Ungkapan Jadual Biasa (CTE)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn