2

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));

テーブルには、単一の顧客名と異なる住所タイプの複数のレコードが含まれる場合があります。

また、1 人の顧客が同じタイプの複数のアドレスを持っている場合もあります。

そのため、顧客は次のような住所を持つ場合があります

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、

出力を次のように取得する方法

cust1,cust2

助けてください。

編集#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(:文字列バッファが小さすぎます)エラーが発生しました。何か理由があるのでしょうか...??

4

1 に答える 1