回答

收藏

在XMLAGG中使用不重复记录

技术问答 技术问答 245 人阅读 | 0 人回复 | 2023-09-12

我在sql中使用XMLAGG遇到问题。
" B: D: `$ Z: x5 U% @9 S我有一个包含多个记录的表,可以重复。该表包含客户地址和客户名称。* P6 Z( ?4 F: g$ _  Y- x
Create Table cust_data(    cust_name varchar二、三十、  cust_addr_line1 varchar2(300)   cust_addr_line2 varchar2(300)   cust_addr_line3 varchar2(300)   cust_addr_type varchar2(3));该表可能包含单个客户名称和不同地址类型的多个记录。2 B7 ?4 P( U' T
同样,单个客户也可能有相同类型的多个地址。: m' i: l0 L$ K* x0 i
因此,客户可能有类似的地址9 N8 A6 I- q; r- E8 _5 ~
cust1 address1 curr_addresscust1 address2 old_addresscust1 address3 old_addresscust1 address4 old_addresscust2 address5 curr_addresscust2 address6 old_address我有一个选择,我想用逗号分隔的格式提取所有的old_addresses客户名。
. y2 m- S9 T4 L1 l; n; f同样的用法,我用下面的SQL
0 t6 y* e, @) O5 b# M' |3 A    select XMLAGG(XMLELEMENT(E,cust_name ||).EXTRACT('//text()') from cust_data where cust_addr_type ='old_address';我得到以下输出:
. L% w4 y3 N! X/ i, C" x4 gcust1,cust1,cust1,cust2,# R# V8 B" d5 G. l! M- x! f
如何获得输出?. z0 l( v6 b+ D# i
客户1,客户2+ P% Q, d: W# N
请帮忙。
. ]: `8 Q1 C% o& C0 V+ `3 @编辑#1:
4 X' i% r6 n+ o& [8 j) b* f. p4 S其它表可以这样做:
9 w1 c2 H7 t5 s( R% PCreate Table cust_info(    cust_name varchar二、三十、  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 varchar二、三十、  pmnt_desc varchar2(300)   pmnt_rate varchar2(300)   pmnt_tenure varchar2(300));查询如下:
# M& H3 `( b4 b8 B" i, t& OSELECT 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数据范围为1万-其他表中的数据范围为1.5万-5000000
8 l/ T3 T4 p% K" a: C$ q如果我内部查询不同的数据应用程序,性能将呈指数下降。
7 C& n, F8 p+ v8 b' j$ T, r还有别的办法吗?
# U' S0 f8 c/ D( R, DEdit#2:同样在使用此内部查询时,在执行过程中,我得到了一个ORA-19011(:字符串缓冲区太小)错误。有什么理由?…吗??
7 ^/ j6 D2 d( f7 O" y9 b                                                               
3 `0 B/ Y, J8 |2 w2 q; W0 M    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则