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

不確定な数の列でUNPIVOT

    テーブルのピボットを解除したいようです(ピボットには、多くの行と2列から1行と多くの列への移動が含まれます)。ほとんどの場合、動的SQLを使用してクエリを生成してから、DBMS_SQLを使用する必要があります。 パッケージ(または潜在的にEXECUTE IMMEDIATE )それを実行します。また、ピボット解除を実行するパイプラインテーブル関数を作成できる必要があります。パイプラインテーブル関数内でも動的SQLを使用する必要がありますが、コードが少なくなる可能性があります。 UNPIVOTを使用した純粋な動的SQLステートメントを期待します ただし、より効率的にするためです。

    非効率的なアプローチですが、比較的簡単に実行できるアプローチは、次のようになります

    SQL> ed
    Wrote file afiedt.buf
    
      1  create or replace type emp_unpivot_type
      2  as object (
      3    empno number,
      4    col   varchar2(4000)
      5* );
    SQL> /
    
    Type created.
    
    SQL> create or replace type emp_unpivot_tbl
      2  as table of emp_unpivot_type;
      3  /
    
    Type created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  create or replace function unpivot_emp
      2  ( p_empno in number )
      3    return emp_unpivot_tbl
      4    pipelined
      5  is
      6    l_val varchar2(4000);
      7  begin
      8    for cols in (select column_name from user_tab_columns where table_name = 'EMP')
      9    loop
     10      execute immediate 'select ' || cols.column_name || ' from emp where empno = :empno'
     11         into l_val
     12       using p_empno;
     13      pipe row( emp_unpivot_type( p_empno, l_val ));
     14    end loop;
     15    return;
     16* end;
    SQL> /
    
    Function created.
    

    次に、SQLステートメントでそれを呼び出すことができます(列名が付いた少なくとも3番目の列が必要だと思います)

    SQL> ed
    Wrote file afiedt.buf
    
      1  select *
      2*   from table( unpivot_emp( 7934 ))
    SQL> /
    
         EMPNO COL
    ---------- ----------------------------------------
          7934 7934
          7934 MILLER
          7934 CLERK
          7934 7782
          7934 23-JAN-82
          7934 1301
          7934
          7934 10
    
    8 rows selected.
    

    より効率的なアプローチは、TomKyteのshow_tableパイプラインテーブル関数を適応させることです。




    1. MySQLレプリケーションで避けるべき主な間違い

    2. INSERTを失敗させるトリガー?可能?

    3. ここでEXECUTEIMMEDIATEが必要なのはなぜですか?

    4. WHM / cPanelサーバーでのProxySQLを使用したMySQLレプリケーション:パート1