我在sql中使用XMLAGG时遇到问题。
我有一个包含多个记录的表,可以重复。该表包含客户地址和客户名称。
Create Table cust_data( cust_name varchar2(30), cust_addr_line1 varchar2(300), cust_addr_line2 varchar2(300), cust_addr_line3 varchar2(300), cust_addr_type varchar2(3));
该表可能包含单个客户名称和不同地址类型的多个记录。
同样,单个客户也可能具有相同类型的多个地址。
因此客户可能有类似的地址
cust1 address1 curr_address cust1 address2 old_address cust1 address3 old_address cust1 address4 old_address cust2 address5 curr_address cust2 address6 old_address
我有一个选择,我想用逗号分隔的格式提取出所有具有old_addresses的客户名称。
使用相同的我用下面的SQL
select XMLAGG(XMLELEMENT(E, cust_name || ',')).EXTRACT('//text()') from cust_data where cust_addr_type ='old_address';
我得到以下输出:
cust1,cust1,cust1,cust2,
如何获得输出为
客户1,客户2
请帮忙。
编辑#1:
其他表可以这样进行:
Create Table cust_info( cust_name varchar2(30), Cust_account varchar2(300), cust_amount_paid varchar2(300), cust_amount_pend varchar2(300), cust_payment_type varchar2(300)); Create Table payment_master_info( pmnt_type varchar2(30), pmnt_desc varchar2(300), pmnt_rate varchar2(300), pmnt_tenure varchar2(300));
查询是这样的:
SELECT XMLAGG(XMLELEMENT(E, CUST_NAME || ',')) .EXTRACT('//text()'), CD.CUST_ADDR_LINE1, CD.CUST_ADDR_LINE2, CD.CUST_ADDR_LINE3, CI.CUST_AMOUNT_PAID, CI.CUST_AMOUNT_PEND, CI.CUST_ACCOUNT FROM CUST_INFO CI, PAYMENT_MASTER_INFO PM, CUST_DATA CD WHERE CD.CUST_NAME = CI.CUST_NAME AND CI.CUST_PAYMENT_TYPE = PM.PMNT_TYPE AND CUST_ADDR_TYPE = 'old_address';
现在的数据在此庞大。pmnt_type中的数据范围为10000-15000,其他表中的数据范围为2100000-5000000
如果我对不同的数据应用内部查询,性能将呈指数下降。
还有其他办法吗?
Edit#2:同样在使用此内部查询时,在执行过程中,我得到一个ORA-19011(:字符串缓冲区太小。)错误。可以有什么理由…吗??
您可以在内部查询中使用DISTINCT:
SQL> select XMLAGG(XMLELEMENT(E, cust_name || ',')).EXTRACT('//text()') 2 from (SELECT distinct cust_name, cust_addr_type FROM cust_data) 3 where cust_addr_type ='old_address'; XMLAGG(XMLELEMENT ----------------- cust1,cust2,