sql >> データベース >  >> RDS >> Oracle

XMLCastおよびXMLQueryでGROUPBYを使用すると、ORA-22950が得られます。

    値を介して集計するには、値が並べ替え可能/ハッシュ可能である必要があります。つまり、任意の2つの値が比較可能である必要があります(並べ替え/ハッシュ化するため)。 XMLType ソート可能/ハッシュ可能ではありません。 Oracleのオブジェクト/クラスは、特別な関数mapのいずれかを持っている場合、ハッシュ可能/ソート可能です。 またはorder 定義されています。 それぞれのOracleドキュメント を参照してください。 。

    xcolを介して集計しています 、これはXMLType 価値。したがって、問題の解決策は、他の何かを介して集約することです。

    あなたが私たちに提供している混沌とした情報に基づいて、2つの解決策が私の頭に浮かびます...

    ソリューション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. データベース設計:登録と検証

    2. SQLPlusでのクエリの出力のフォーマット

    3. Railsschema.rbには新しいカスタムPostgres関数が含まれていません

    4. プリペアドステートメントを動的に作成する方法-そしてクエリを再利用する