[英]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
如您所見,兩者都返回相同的結果。
我可以為您的案例提出一個查詢嗎? 沒有; 正如我所說,我沒有你的桌子,我不知道orders
和services
是如何相互關聯的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.