sql >> Database >  >> RDS >> Oracle

SQL-query met meerdere letters haalt één rij op als meerdere kolommen

In Oracle 11.1 en hoger kunt u de UNPIVOT . gebruiken exploitant. Als u een grote hoeveelheid gegevens heeft, zal dit een aanzienlijke verbetering van de uitvoeringstijd opleveren, omdat de tabel slechts één keer hoeft te worden gelezen, in plaats van drie keer met welke vorm van UNION ALL dan ook. aanpak.

Ik heb de kolomnaam (in de uitvoer) gewijzigd van date naar dt aangezien DATE een gereserveerd woord is in Oracle. type is niet veel beter (het is een trefwoord maar het is niet gereserveerd); het beste om het ook te vermijden. Ik heb je datums ook als tekenreeksen behandeld toen ik de testgegevens maakte, maar het werkt precies hetzelfde met datums.

De with clausule maakt geen deel uit van de oplossing (kopieer en plak deze niet blindelings met de vraag); Ik heb het alleen voor testdoeleinden toegevoegd.

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. Relatie tussen primaire sleutel en geclusterde index

  2. beschermen browsers het IP-adres van gebruikers?

  3. MySQL-tabel op verschillende pagina's aanpassen met scores uit een HTML-formulier

  4. MySQL - Selecteer gegevens met een JOIN maar met WHERE-clausules die van toepassing zijn op complexe en verschillende perimeters