sql >> Databáze >  >> RDS >> Oracle

Jak zřetězit více řádků pořadí podle sekvence v Oracle10g

Nikdy nepoužívejte WM_CONCAT . Přečtěte si Proč nepoužít funkci WM_CONCAT v Oracle?

Viz toto téma https://stackoverflow.com/a/28758117/3989608 .

Je to nezdokumentované a každá aplikace, která se spoléhá na WM_CONCAT po upgradu na 12c nebude fungovat protože byl odstraněn z nejnovější verze 12c.

Existuje mnoho způsobů, jak provést agregaci řetězců , v závislosti na verzi databáze . Viz několik příkladů níže:

11gR2

Použijte 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 a vyšší

Použijte ROW_NUMBER() a 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. C++ vazby pro MySQL

  2. propojení postgresql a codeigniter

  3. Převeďte formát data na formát DD/MMM/RRRR na serveru SQL

  4. PostgreSQL dynamicky upravuje pole v NEW záznamu ve spouštěcí funkci