我在 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';
我得到以下输出:
客户 1,客户 1,客户 1,客户 2,
如何获得输出
客户1,客户2
请帮忙。
Edit#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
如果我对不同的数据应用内部查询,性能会呈指数下降。
还有其他办法吗?
编辑#2:此外,在使用此内部查询时,在执行过程中,我收到 ORA-19011(:字符串缓冲区太小。)错误。有什么原因吗......?