sql >> Database >  >> RDS >> Oracle

Oracle SQL Meerdere rijen samenvoegen met dezelfde ID maar niet-bestaande identifiers

Zoiets als dit (ervan uitgaande dat er geen dubbele rijen in de invoertabel zijn - als die er zijn, moet de oplossing een beetje worden aangepast).

In de oplossing bouw ik de test_table om te testen (het maakt geen deel uit van de oplossing), en ik bouw een andere gefactorde subquery in de WITH-component. Dit werkt in Oracle 11 en hoger. Voor eerdere versies van Oracle is de subquery gedefinieerd als prep moet in plaats daarvan worden verplaatst als een subquery binnen de laatste query.

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
;

Uitvoer :

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. De beste manier om te zien dat 3 of meer opeenvolgende records ontbreken

  2. JSON_MERGE_PATCH() versus JSON_MERGE_PRESERVE() in MySQL:wat is het verschil?

  3. MySQL verbinden met Apache nutch

  4. SQL-query om dubbele waarden te verwijderen in een inner join van 3 tabellen met twee verschillende databases