sql >> Databasteknik >  >> RDS >> Oracle

SQL-fråga med flera fall hämta en rad som flera kolumner

I Oracle 11.1 och senare kan du använda UNPIVOT operatör. Om du har en stor volym data kommer detta att ge en avsevärd förbättring av exekveringstid, eftersom det kräver att du läser tabellen bara en gång, istället för tre gånger med någon typ av UNION ALL tillvägagångssätt.

Jag ändrade kolumnnamnet (i utgången) från date till dt eftersom DATE är ett reserverat ord i Oracle. typ är inte mycket bättre (det är ett nyckelord men det är inte reserverat); bäst att undvika det också. Jag behandlade även dina datum som strängar när jag skapade testdata, men det fungerar precis på samma sätt med datum.

med klausul är inte en del av lösningen (kopiera och klistra inte blint in den med frågan); Jag lade till det bara för testsyften.

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. Symfony :Doktrindatafixtur :hur hanterar man stor csv-fil?

  2. nvl() funktion i php-fil

  3. SQL Query - Begränsande frågeresultat

  4. Hur man går med har många relationstabeller och hämta resultat efter typ