Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengubah Jadual Oracle SQL secara Dinamik dengan Nilai Dinamik?

Bagaimana untuk Mengubah Jadual Oracle SQL secara Dinamik dengan Nilai Dinamik?

Patricia Arquette
Patricia Arquetteasal
2025-01-24 01:01:10337semak imbas

How to Dynamically Pivot Oracle SQL Tables with Dynamic Values?

Pivot dinamik dan nilai dinamik Oracle SQL

Cabaran biasa apabila menggunakan jadual pangsi dalam Oracle SQL ialah mencipta jadual pangsi dengan nilai dinamik. Pendekatan tradisional ialah menambah nilai baharu secara manual pada rentetan statik yang digunakan dalam penyata IN jadual pangsi, yang tidak cekap.

Had penyataan IN dinamik

Membenamkan pernyataan dinamik terus ke dalam pernyataan PIVOT IN menggunakan subkueri, pembolehubah PL/SQL atau pertanyaan bersarang tidak disokong. Selain itu, menggunakan PIVOT XML boleh menghasilkan output suboptimum.

Penyelesaian: Buat rentetan IN dinamik

Untuk mengatasi batasan ini, kaedah mencipta rentetan IN dinamik boleh digunakan. Berikut ialah panduan langkah demi langkah:

  1. Buat pernyataan SELECT untuk menjana rentetan dinamik:

    • Gunakan COLUMN NEW_VALUE dan LISTAGG untuk menggabungkan nilai yang dikehendaki ke dalam satu rentetan, dipisahkan dengan koma.
    • Simpan rentetan ini dalam pembolehubah, seperti str_in_statement.
  2. Contoh: Pertimbangkan contoh jadual berikut:

<code>| myNumber | myValue | myLetter |
|---|---|---|
| 1 | 2 | A |
| 1 | 4 | B |
| 2 | 6 | C |
| 2 | 8 | A |
| 2 | 10 | B |
| 3 | 12 | C |
| 3 | 14 | A |</code>

Untuk menjana rentetan IN dinamik, laksanakan pernyataan berikut:

<code class="language-sql">COLUMN temp_in_statement new_value str_in_statement
SELECT DISTINCT 
    LISTAGG('''' || myLetter || ''' AS ' || myLetter,',')
        WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement 
    FROM (SELECT DISTINCT myLetter FROM myTable);</code>
  1. Sertakan rentetan dinamik ke dalam pertanyaan pangsi:

    • Gunakan pembolehubah yang mengandungi rentetan dinamik sebagai parameter IN bagi pertanyaan pangsi.
  2. Contoh pertanyaan pangsi:

<code class="language-sql">SELECT * FROM 
    (SELECT myNumber, myLetter, myValue FROM myTable)
    PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));</code>

Output:

<code>| MYNUMBER | A_VAL | B_VAL | C_VAL |
|---|---|---|---|
| 1 | 2 | 4 | NULL |
| 2 | 8 | 10 | 6 |
| 3 | 14 | NULL | 12 |</code>

Had:

Penghadan kaedah ini ialah saiz rentetan maksimum yang boleh digabungkan ialah 4000 bait.

Atas ialah kandungan terperinci Bagaimana untuk Mengubah Jadual Oracle SQL secara Dinamik dengan Nilai Dinamik?. 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