sql >> データベース >  >> RDS >> Oracle

SELECTリストのサブクエリ内にある個別のLISTAGG

    次のメソッドは、インラインビューを削除して重複をフェッチし、REGEXP_REPLACEを使用します。 およびRTRIM LISTAGGaggregated listで個別の結果セットを取得する関数 。したがって、複数のスキャンを実行することはありません。

    この部分をコードに追加します、

    RTRIM(REGEXP_REPLACE(listagg (tm_redir.team_code, ',') 
                         WITHIN GROUP (ORDER BY tm_redir.team_code),
                         '([^,]+)(,\1)+', '\1'),
                         ',')
    

    変更されたクエリ-

    SQL> with tran_party as -- ALL DUMMY DATA ARE IN THESE CTE FOR YOUR REFERENCE
      2           (select 1 tran_party_id, 11 transaction_id, 101 team_id_redirect
      3              from dual
      4            union all
      5            select 2, 11, 101 from dual
      6            union all
      7            select 3, 11, 102 from dual
      8            union all
      9            select 4, 12, 103 from dual
     10            union all
     11            select 5, 12, 103 from dual
     12            union all
     13            select 6, 12, 104 from dual
     14            union all
     15            select 7, 13, 104 from dual
     16            union all
     17            select 8, 13, 105 from dual),
     18       tran as
     19           (select 11 transaction_id, 1001 account_id, 1034.93 amount from dual
     20            union all
     21            select 12, 1001, 2321.89 from dual
     22            union all
     23            select 13, 1002, 3201.47 from dual),
     24       account as
     25           (select 1001 account_id, 111 team_id from dual
     26            union all
     27            select 1002, 112 from dual),
     28       team as
     29           (select 101 team_id, 'UUU' as team_code from dual
     30            union all
     31            select 102, 'VV' from dual
     32            union all
     33            select 103, 'WWW' from dual
     34            union all
     35            select 104, 'XXXXX' from dual
     36            union all
     37            select 105, 'Z' from dual)
     38  -- The Actual Query
     39  select a.account_id,
     40         t.transaction_id,
     41         (SELECT  RTRIM(
     42           REGEXP_REPLACE(listagg (tm_redir.team_code, ',')
     43                     WITHIN GROUP (ORDER BY tm_redir.team_code),
     44             '([^,]+)(,\1)+', '\1'),
     45           ',')
     46            from tran_party tp_redir
     47                 inner join team tm_redir
     48                     on tp_redir.team_id_redirect = tm_redir.team_id
     49                 inner join tran t_redir
     50                     on tp_redir.transaction_id = t_redir.transaction_id
     51           where     t_redir.account_id = a.account_id
     52                 and t_redir.transaction_id != t.transaction_id)
     53             AS teams_redirected
     54    from tran t inner join account a on t.account_id = a.account_id
     55  /
    
    ACCOUNT_ID TRANSACTION_ID TEAMS_REDIRECTED
    ---------- -------------- --------------------
          1001             11 WWW,XXXXX
          1001             12 UUU,VV
          1002             13
    
    SQL>
    



    1. PostgreSQL 12:外部キーとパーティションテーブル

    2. MySQLConverter'オブジェクトには、mysql-connectorで属性'_tuple_to_mysql'例外がありません

    3. MyISAMとInnoDB

    4. MySQL-行のカウントと左結合の問題