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

UNPIVOT på et ubestemt antal kolonner

Det lyder som om du ønsker at deaktivere pivotering af tabellen (pivotering vil involvere at gå fra mange rækker og 2 kolonner til 1 række med mange kolonner). Du skal højst sandsynligt bruge dynamisk SQL til at generere forespørgslen og derefter bruge DBMS_SQL pakke (eller potentielt EXECUTE IMMEDIATE ) for at udføre det. Du bør også være i stand til at konstruere en pipelinet tabelfunktion, der gjorde unpivotingen. Du skal også bruge dynamisk SQL i pipelinet tabelfunktion, men det ville potentielt være mindre kode. Jeg ville forvente en ren dynamisk SQL-sætning ved hjælp af UNPIVOT for at være mere effektiv dog.

En ineffektiv tilgang, men en der er relativt nem at følge, ville være noget i stil med

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.

Du kan derefter kalde det i en SQL-sætning (jeg vil tro, at du vil have mindst en tredje kolonne med kolonnenavnet)

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.

En mere effektiv tilgang ville være at tilpasse Tom Kytes pipelinede tabelfunktion show_table.




  1. Sådan bruges SQL SUM-funktionen

  2. Installer Oracle Instant-klient i Docker-container til Python cx_Oracle

  3. Kan ikke binde argument ved indeks 2, fordi indekset er uden for rækkevidde

  4. Hvordan kan jeg oprette forbindelse til SQL Server ved hjælp af integreret sikkerhed med JDBC-driveren?