Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menggunakan GROUP BY dengan XMLCast dan XMLQuery memberikan ORA-22950

Untuk mengagregasi melalui suatu nilai, nilainya harus dapat diurutkan/dapat di-hash, artinya dua nilai harus sebanding (agar dapat diurutkan/di-hash). XMLType tidak dapat diurutkan/hashable. Objek/kelas di Oracle dapat di-hash/disortir ketika memiliki salah satu fungsi khusus map atau order didefinisikan. Lihat dokumentasi Oracle masing-masing .

Anda menggabungkan melalui xcol , yang merupakan XMLType nilai. Jadi, penyelesaian masalah Anda adalah dengan menggabungkannya melalui sesuatu yang lain.

Berdasarkan info kacau yang Anda berikan kepada kami, dua solusi muncul di benak saya ...

Solusi 1

WITH xdata AS
     (SELECT 1 AS a_id,
             xmltype ('<a>
                <b>
                    <b_id>1</b_id>
                    <val>2</val>
                </b>
                <b>
                    <b_id>1</b_id>
                    <val>3</val>
                </b>
             </a>') AS xcol
        FROM DUAL
      UNION ALL
      SELECT 2 AS a_id,
             xmltype ('<a>
                <b>
                    <b_id>3</b_id>
                    <val>5</val>
                </b>
                <b>
                    <b_id>4</b_id>
                    <val>4</val>
                </b>
             </a>') AS xcol
        FROM DUAL)
SELECT a_id,
     sum(XMLCAST (
         XMLQUERY ('sum($doc/a/b/val)'
                   PASSING xcol AS "doc" RETURNING CONTENT) AS INTEGER))
         b_val
FROM xdata
group by a_id;

Solusi 2

WITH xdata AS
     (SELECT 1 AS a_id,
             xmltype ('<a>
                <b>
                    <b_id>1</b_id>
                    <val>2</val>
                </b>
                <b>
                    <b_id>1</b_id>
                    <val>3</val>
                </b>
             </a>') AS xcol
        FROM DUAL
      UNION ALL
      SELECT 2 AS a_id,
             xmltype ('<a>
                <b>
                    <b_id>3</b_id>
                    <val>5</val>
                </b>
                <b>
                    <b_id>4</b_id>
                    <val>4</val>
                </b>
             </a>') AS xcol
        FROM DUAL)
select X.a_id, sum(Y.b_val) as b_val
from xdata X
    cross join xmltable(
        '/a/b'
        passing X.xcol
        columns
            b_val integer path 'val'
    ) Y
group by X.a_id;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversi Oracle varchar2 ke nvarchar2

  2. OpenQuery dari SQL Server ke server Oracle hang tanpa batas jika koneksi terputus

  3. Nilai n teratas yang berbeda dari satu kolom di Oracle

  4. Bagaimana cara memperbaiki file ekspor Oracle (.dmp) yang rusak?

  5. Sinkronisasi prosedur PL/SQL. Bagaimana menjamin pelaksanaan prosedur hanya satu kali?