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

Oracle SQL Sloučit více řádků se stejným ID, ale mimo pořadí identifikátorů

Něco takového (za předpokladu, že ve vstupní tabulce nejsou žádné duplicitní řádky – pokud existují, je třeba řešení trochu upravit).

V řešení sestavuji test_table pro testování (není součástí řešení) a sestavuji další faktorovaný poddotaz v klauzuli WITH. Toto funguje v Oracle 11 a výše. Pro dřívější verze Oracle byl poddotaz definován jako prep je třeba místo toho přesunout jako poddotaz v rámci konečného dotazu.

with
     test_table ( id, identifiers ) as (
       select '1', '|1|2|'        from dual union all
       select '1', '|2|1|'        from dual union all
       select '2', '|3|A|1|B|'    from dual union all
       select '2', '|B|1|3|A|'    from dual union all
       select '3', '|1|3|2|'      from dual union all
       select '3', '|1|5|'        from dual union all
       select '3', '|2|1|3|'      from dual union all
       select '4', '|AA|BB|1|3A|' from dual union all
       select '4', '|1|3A|AA|BB|' from dual
     ),
     prep ( id, identifiers, token ) as (
       select id, identifiers, regexp_substr(identifiers, '[^|]+', 1, level)
       from   test_table
       connect by level <= regexp_count(identifiers, '\|') - 1
           and prior identifiers = identifiers
           and prior sys_guid() is not null
     )
select distinct id, 
       '|' || listagg(token, '|') within group (order by token) || '|'
                                                as identifiers
from   prep
group by id, identifiers
order by id, identifiers    --  ORDER BY is optional
;

Výstup :

ID  IDENTIFIERS
--- --------------------
1   |1|2|
2   |1|3|A|B|
3   |1|2|3|
3   |1|5|
4   |1|3A|AA|BB|

5 rows selected.



  1. neinicializovaná konstanta MysqlCompat::MysqlRes (pomocí gem mms2r)

  2. Jak předat řetězec jako klauzuli WHERE v MYSQL

  3. Výsledek vyhledávání klíčových slov a hodnocení

  4. Ubuntu ORA-24960:atribut OCI_ATTR_USERNAME je větší než maximální povolená délka 255