簡體   English   中英

如何將此 listagg function 替換為 xmlagg

[英]How can I replace this listagg function to xmlagg

我想使用 XMLAGG function 替換以下查詢,並消除不同的邏輯。

SELECT
 listagg(distinct OD.PROD_NAME,';') within group(order by SC.CATEGORY_ID) as PRODUCT
 FROM 
 orders OD,
SERVICES SC

    

我試圖參考下面的查詢,但無法理解

select
   deptno,
   rtrim (xmlagg (xmlelement (e, ename || ',')).extract ('//text()'), ',') enames
from
   emp
group by
   deptno
;

您用“Oracle 11g”標簽標記了問題; 它不支持LISTAGG (DISTINCT...) - distinct是在 19c 中引入的 - 如果您不在該版本(或更高版本)上,則無法使用它。

那該怎么辦? 使用子查詢來獲取您需要的不同值,並將其(子查詢)連接到另一個表。

這是一個基於 Scott 的示例模式的示例(因為我沒有您的表):

SQL> SELECT LISTAGG (e.job, ';') WITHIN GROUP (ORDER BY d.deptno, e.job) result
  2    FROM (SELECT DISTINCT deptno, job
  3            FROM emp) e
  4         JOIN dept d ON d.deptno = e.deptno;

RESULT
------------------------------------------------------------------------------------------------------------------------
CLERK;MANAGER;PRESIDENT;ANALYST;CLERK;MANAGER;CLERK;MANAGER;SALESMAN

SQL>
SQL>
SQL> SELECT RTRIM (
  2            XMLAGG (XMLELEMENT (e, e.job || ';') ORDER BY d.deptno, e.job).EXTRACT (
  3               '//text()'),
  4            ';') result
  5    FROM (SELECT DISTINCT deptno, job
  6            FROM emp) e
  7         JOIN dept d ON d.deptno = e.deptno;

RESULT
------------------------------------------------------------------------------------------------------------------------
CLERK;MANAGER;PRESIDENT;ANALYST;CLERK;MANAGER;CLERK;MANAGER;SALESMAN

SQL>

或者,一個低於另一個(為了更好的可見性):

LISTAGG: CLERK;MANAGER;PRESIDENT;ANALYST;CLERK;MANAGER;CLERK;MANAGER;SALESMAN     
XMLAGG : CLERK;MANAGER;PRESIDENT;ANALYST;CLERK;MANAGER;CLERK;MANAGER;SALESMAN  

如您所見,兩者都返回相同的結果。


我可以為您的案例提出一個查詢嗎? 沒有; 正如我所說,我沒有你的桌子,我不知道ordersservices是如何相互關聯的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM