Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak połączyć wiele wierszy w kolejności według sekwencji w Oracle10g?

Nigdy nie używaj WM_CONCAT . Przeczytaj Dlaczego nie używać funkcji WM_CONCAT w Oracle?

Zobacz ten temat https://stackoverflow.com/a/28758117/3989608 .

Jest nieudokumentowany i każda aplikacja, która opiera się na WM_CONCAT nie będzie działać po aktualizacji do 12c ponieważ został usunięty z najnowszej wersji 12c.

Istnieje wiele sposobów na agregację ciągów , w zależności od wersji bazy danych . Zobacz kilka przykładów poniżej:

11gR2

Użyj 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 i nowsze

Użyj ROW_NUMBER() i 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. W Oracle AS alias nie działa

  2. Suma Suma częściowa w widoku siatki

  3. Wyzwalanie tylko dla zmienionych wartości

  4. ORACLE aktualizuje rekordy z relacją od 1 do wielu tabel w wyzwalaczu

  5. Oracle Rolling lub Running sumy według miesiąca