sql >> Database teknologi >  >> RDS >> Oracle

hvordan man kombinerer to forskellige værdier fra én tabel for én kunde til én række

Du skal GROUP BY id , og betingelsen om "mere end én ordre" går ind i en HAVING klausul (fordi det er en begrænsning for hver gruppe, ikke på hver enkelt række i inputdataene). Sammenlægningen udføres med LISTAGG .

with
     test_data ( id, product, code ) as (
       select 1, 'Apple' , 145 from dual union all
       select 1, 'Grapes', 146 from dual union all
       select 2, 'Orange', 147 from dual union all
       select 2, 'Apple' , 145 from dual union all
       select 2, 'Plum'  , 148 from dual union all
       select 3, 'Grapes', 146 from dual union all
       select 3, 'Orange', 147 from dual union all
       select 4, 'Grapes', 146 from dual union all
       select 5, 'Orange', 147 from dual
     )
--  End of test data (not part of the solution). Query begins below this line.
select   id, listagg(code, ' | ') within group (order by id) as codes
from     test_data
group by id
having   count(*) > 1
;

ID  CODE
--  ---------------
 1  145 | 146
 2  145 | 147 | 148
 3  146 | 147

I Oracle 10 har du dog ikke LISTAGG() . Før Oracle 11.2 var en almindelig måde at få det samme resultat på at bruge hierarkiske forespørgsler, noget som nedenfor:

select id, ltrim(sys_connect_by_path(code, ' | '), ' | ') as codes
from   (
         select id, code,
                row_number() over (partition by id order by code) as rn
         from   test_data
       )
where connect_by_isleaf = 1 and level > 1
connect by rn = prior rn + 1
       and prior id = id
       and prior sys_guid() is not null
start with rn = 1
;

REDIGERET :

Hvis gentagen KODE for det samme ID skal "adskilles" først, så - ved brug af den anden løsning - er følgende ændringer nødvendige, begge i den inderste underforespørgsel:

  • ændre SELECT ID, CODE, ... til SELECT DISTINCT ID, CODE, ...

  • ændre ROW_NUMBER() til DENSE_RANK()




  1. Sådan indstilles lokaliteten for den aktuelle forbindelse i MySQL

  2. Vil du oprette forbindelse til to forskellige databaser i PHP?

  3. Hvordan henter man den aktuelle version af et MySQL-databasestyringssystem (DBMS)?

  4. Kopier data fra en tabel til en anden med en bestemt betingelse