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

Oracle10gで複数の行をシーケンスごとに連結する方法

    WM_CONCATは絶対に使用しないでください 。 WM_CONCAT関数を使用しない理由を読むオラクルでは?

    このトピックを参照してください https://stackoverflow.com/a/28758117/3989608 。

    これは文書化されておらず、WM_CONCATに依存するアプリケーションはすべて 12cにアップグレードすると機能しなくなります 最新の12cバージョンから削除されたためです。

    文字列集約を実行する方法はたくさんあります 、データベースのバージョンによって異なります 。以下のいくつかの例を参照してください:

    11gR2

    LIASTAGGを使用する :

    SQL> SELECT grp,
      2    listagg(command, ',') WITHIN GROUP(
      3  ORDER BY seq) command
      4  FROM t
      5  GROUP BY grp;
    
    GRP COMMAND
    --- --------------------------------------------------------------------------------------------
    ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
    TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
    
    SQL>
    

    9i以上

    ROW_NUMBER()を使用します およびSYS_CONNECT_BY_PATH

    SQL> SELECT grp,
      2         LTRIM(MAX(SYS_CONNECT_BY_PATH(command,','))
      3         KEEP (DENSE_RANK LAST ORDER BY seq),',') command
      4  FROM   (SELECT grp,
      5                 command,
      6                 seq,
      7                 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) AS curr,
      8                 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) -1 AS prev
      9          FROM   t)
     10  GROUP BY grp
     11  CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
     12  START WITH curr = 1;
    
    GRP COMMAND
    --- --------------------------------------------------------------------------------------------
    ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
    TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
    
    SQL>
    



    1. パフォーマンスの高いCTEテーブルと一時テーブルのどちらですか?

    2. Postgresタイムスタンプクエリ範囲を最適化する

    3. MySQLでテーブルをコピーする方法

    4. group Byを使用してSQLにLinqし、カウントで並べ替える