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

multiple case SQL-forespørgsel henter enkelt række som flere kolonner

I Oracle 11.1 og nyere kan du bruge UNPIVOT operatør. Hvis du har en stor mængde data, vil dette give en betydelig forbedring i udførelsestid, da det kræver, at du kun læser tabellen én gang i stedet for tre gange med enhver form for UNION ALL tilgang.

Jeg ændrede kolonnenavnet (i outputtet) fra dato til dt da DATE er et reserveret ord i Oracle. type er ikke meget bedre (det er et nøgleord, men det er ikke reserveret); bedst at undgå det også. Jeg behandlede også dine datoer som strenge, da jeg oprettede testdataene, men det fungerer på samme måde med datoer.

med klausul er ikke en del af løsningen (kopier og indsæt den ikke blindt sammen med forespørgslen); Jeg tilføjede det kun til testformål.

with
     test_data ( ID, VT_Type1, Vt_type2, VT_Type3, Status_1, Status_2, Status_3, 
                                                         Date_1, Date_2, Date_3 ) as (
       select 1, -1, -1,  0, 'X', 'Y', 'Z', '04/12', '05/12', '06/12' from dual union all
       select 2, -1, -1, -1, 'A', 'B', 'C', '06/12', '07/12', '07/10' from dual
     )
select  id, type, status, dt
from    test_data
unpivot ( (vt_type, status, dt) for type in ( (vt_type1, status_1, date_1) as 1,
                                              (vt_type2, status_2, date_2) as 2,
                                              (vt_type3, status_3, date_3) as 3
                                            )
        )
where   vt_type != 0
;

ID  TYPE  STATUS  DT
--  ----  ------  -----
 1     1  X       04/12
 1     2  Y       05/12
 2     1  A       06/12
 2     2  B       07/12
 2     3  C       07/10


  1. Hvad betyder mysql workbench-kolonneikonerne

  2. Sådan bruger du spool-kommando i sql-udvikler-oracle

  3. Enhedsklasse fra databasen....Fejl Ugyldig ressource _pm

  4. Intet modul ved navn MySQLdb, selvom MySQL-python er installeret?