sql >> データベース >  >> RDS >> Oracle

複数の場合の SQL クエリは、単一の行を複数の列として取得します

    Oracle 11.1 以降では、UNPIVOT を使用できます。 オペレーター。大量のデータがある場合、これにより実行時間が大幅に改善されます。UNION ALL を使用してテーブルを 3 回読み取るのではなく、1 回だけ読み取る必要があるためです。

    (出力の) 列名を date から変更しました dt へ DATE は Oracle の予約語であるためです。 type あまり良くありません(キーワードですが、予約されていません)。それも避けるのが一番。テスト データを作成したときに日付も文字列として扱いましたが、日付でも同じように機能します。

    with 句はソリューションの一部ではありません (やみくもにコピーしてクエリに貼り付けないでください)。テスト目的で追加しました。

    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. Oracle INSERT INTO SELECT(...)DUP_VAL_ON_INDEX例外動作

    2. Javaの日付型をmysqlの日付型に保存する方法は?

    3. OracleでRowidの最大長を把握しようとしています

    4. ホスト(Windows)からVirtualBoxのOracleDBにアクセスする方法