sql >> Databasteknik >  >> RDS >> Oracle

Att använda GROUP BY med en XMLCast och XMLQuery ger ORA-22950

För att kunna aggregera via ett värde måste värdet vara sorterbart/hashbart efter, vilket innebär att två valfria värden måste vara jämförbara (för att kunna sorteras/hashas). XMLType är inte sorterbar/hashbar. Ett objekt/klass i Oracle är hashbar/sorterbar när den har en av specialfunktionerna map eller order definierat. Se respektive Oracle-dokumentation .

Du aggregerar via xcol , som är en XMLType värde. Så en lösning på ditt problem skulle vara att aggregera via något annat.

Baserat på den kaotiska information du ger oss, kommer jag att tänka på två lösningar ...

Lösning 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;

Lösning 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. hur man kör mysql-kommandot DELIMITER

  2. UTL_MATCH-liknande funktion för att fungera med CLOB

  3. Ansluta till en Mysql DB med C# - Behöver några med datamängder

  4. php pdo emulate_prepares false stringify_fetches false int still string