Oracle
 sql >> база данни >  >> RDS >> Oracle

Използването на GROUP BY с XMLCast и XMLQuery дава ORA-22950

За да се агрегира чрез стойност, стойността трябва да може да се сортира/хешира по, което означава, че всеки две стойности трябва да бъдат сравними (за да бъдат сортирани/хеширани). XMLType не може да се сортира/хешира. Обект/клас в Oracle може да се хешира/сортира, когато има една от специалните функции map или order дефинирани. Вижте съответната документация на Oracle .

Вие агрегирате чрез xcol , което е XMLType стойност. Така че решението на вашия проблем би било агрегиране чрез нещо друго.

Въз основа на хаотичната информация, която ни предоставяте, ми идват наум две решения...

Разтвор 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;

Решение 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. Как да върна ResultSet от съхранена процедура в Oracle?

  2. неочакван успех на заявката

  3. Как мога да се свържа с уеб базирана база данни на Oracle с Java?

  4. java.lang.ClassCastException:oracle.sql.BLOB не може да бъде прехвърлен към oracle.sql.BLOB

  5. Как да изброите всички изгледи в базата данни на Oracle