sql >> Database >  >> RDS >> Oracle

Het gebruik van GROUP BY met een XMLCast en XMLQuery geeft ORA-22950

Om via een waarde te kunnen aggregeren, moet de waarde sorteerbaar/hashbaar zijn op, wat betekent dat twee waarden vergelijkbaar moeten zijn (om te kunnen worden gesorteerd/gehasht). XMLType is niet sorteerbaar/hashbaar. Een object/klasse in Oracle is hashbaar/sorteerbaar als het een van de speciale functies heeft map of order bepaald. Zie de respectievelijke Oracle-documentatie .

Je aggregeert via xcol , wat een XMLType . is waarde. Dus een oplossing voor uw probleem zou zijn om via iets anders te verzamelen.

Op basis van de chaotische informatie die je ons geeft, komen er twee oplossingen in me op ...

Oplossing 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;

Oplossing 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. hoe datum EN tijd op te slaan met JPA in Oracle?

  2. Oracle SQL:filteren op ROWNUM geeft geen resultaten wanneer het zou moeten

  3. 2 manieren om rijen te retourneren die alleen niet-alfanumerieke tekens bevatten in MariaDB

  4. mysql - INSERT datumbereik in datumkolommen ALS datums niet overlappen met bestaande