[英]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.