繁体   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