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

Oracle SQL Połącz wiele wierszy z tym samym identyfikatorem, ale niezgodnymi identyfikatorami

Coś w tym stylu (zakładając, że nie ma zduplikowanych wierszy w tabeli wejściowej - jeśli tak, rozwiązanie należy nieco zmodyfikować).

W rozwiązaniu buduję tabelę test_table do testowania (nie jest ona częścią rozwiązania) i buduję kolejne podzapytanie z podziałem na czynniki w klauzuli WITH. Działa to w Oracle 11 i nowszych. We wcześniejszych wersjach Oracle podzapytanie zdefiniowane jako prep zamiast tego należy przenieść jako podzapytanie w ostatnim zapytaniu.

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
;

Wyjście :

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć obiekt oracle.sql.ARRAY?

  2. kwerenda Oracle sql dla rekordów ze znacznikiem czasu mieszczącym się między dwoma znacznikami czasu

  3. Przewidywanie wzrostu tabeli Oracle

  4. Dowiedz się, którzy pracownicy byli nieobecni przez 3 kolejne dni

  5. Jak przechowywać tylko czas; nie data i godzina?