Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng GROUP BY với XMLCast và XMLQuery mang lại ORA-22950

Để tổng hợp thông qua một giá trị, giá trị phải có thể sắp xếp / có thể băm, nghĩa là hai giá trị bất kỳ phải có thể so sánh được (để được sắp xếp / băm). XMLType không thể sắp xếp / băm được. Một đối tượng / lớp trong Oracle có thể băm / có thể sắp xếp khi nó có một trong các hàm đặc biệt map hoặc order được xác định. Xem tài liệu Oracle tương ứng .

Bạn đang tổng hợp qua xcol , là một XMLType giá trị. Vì vậy, cách giải quyết vấn đề của bạn sẽ được tổng hợp thông qua một thứ khác.

Dựa trên thông tin hỗn loạn mà bạn đang cung cấp cho chúng tôi, tôi nghĩ đến hai giải pháp ...

Giải pháp 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;

Giải pháp 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. Làm thế nào để chạy tập lệnh cụ thể sau khi kết nối với oracle bằng đường ray?

  2. truy vấn SQL nhiều chữ hoa chữ thường truy xuất một hàng dưới dạng nhiều cột

  3. Có một chức năng để tách một chuỗi trong PL / SQL?

  4. Oracle LISTAGG () cho nhiều thuộc tính?

  5. Trong Oracle, liên quan đến cú pháp - làm cách nào để chuyển đổi cú pháp (+) thành JOIN thông thường hiện đại?