2016-05-23 17 views
0

Ich habe Schwierigkeiten mit der Benennung Spalten in einer Tabelle, mit einer Referenztabelle, die diese Namen enthält. Ich bin mir sicher, dass es möglich sein sollte, aber ich kann nicht die richtige Lösung finden oder denke an die richtige Logik, um es zu erreichen ...Oracle PL/SQL Spaltennamen mit anderen Tabelle

Situation: Ich habe 2 Tabellen, eine mit Daten, Spalten mit beschreibenden Namen, und einer mit einer Übersetzung dieser Spaltennamen zu aussagekräftigen Namen (Referenztabelle oder "Codebuch").

Ich bin auf der Suche nach einer Möglichkeit, die Daten der ersten Tabelle mit den Namen der Spalten in der zweiten Spalte der zweiten Tabelle zurückgegeben.

Tabellen wie folgt aussehen:

dataTable: 
q1,q2,q3 
1,2,3 
4,5,6 

und

translationTable: 
descName, meanName 
q1, meaning1 
q2, meaning2 
q3, meaning3 

Ergebnis sein sollte:

meaning1,meaning2,meaning3 
1,2,3 
4,5,6 

Hilfe wäre sehr geschätzt!

+0

Ich habe nicht hart genug gesucht, Ausreden! Sowohl das Problem als auch die Antwort werden hier erklärt: http://stackoverflow.com/questions/22309099/rename-columns-in-1-table-to-row-values-in-an-other-table – Dendrobates

Antwort

1

Sie können es nicht direkt tun, weil Sie eine Abfrage benötigen, deren Spalten basierend auf einem bestimmten Wert variabel sind. etwas anders, was Sie tun können, ist eine dynamische SQL-bauen Sie Ihre Abfrage von Oracle erstellt haben:

SETUP:

SQL> create table dataTable(q1,q2,q3) as 
    2 select 1,2,3 from dual union all 
    3 select 4,5,6 from dual 
    4 ; 

Table created. 

SQL> create table translationTable(descName, meanName) as 
    2 select 'q1', 'meaning1' from dual union all 
    3 select 'q2', 'meaning2' from dual union all 
    4 select 'q3', 'meaning3' from dual ; 

Table created. 

Dies wird erstellen und Ihre Abfrage drucken:

SQL> declare 
    2  vSQL varchar2(1000); 
    3 begin 
    4  select listagg (column_name || ' AS "' || meanName || '"', ', ') within group (order by column_name) 
    5  into vSQL 
    6  from user_tab_columns col 
    7  inner join translationTable tr 
    8   on (upper(tr.descName) = col.column_name) 
    9  where table_name = upper('dataTable'); 
10  -- 
11  vSQL := 'select ' || vSQL || ' from dataTable'; 
12  dbms_output.put_line(vSQL); 
13 end; 
14/
select Q1 AS "meaning1", Q2 AS "meaning2", Q3 AS "meaning3" from dataTable 

PL/SQL procedure successfully completed. 

Wenn Sie kopieren die Anweisung und führen sie aus:

So haben Sie Sie r Abfrage, aber Sie können es nicht abrufen, da es immer noch variable Spalten hat.

Sie können diesen Code einfach bearbeiten, um eine Abfrage zu erstellen, die Strings zurückgibt, die durch Verkettung der Felder erstellt wurden. Auf diese Weise haben Sie immer ein einzelnes Feld, aber es ist anders als Sie gefragt haben:

SQL> select 'meaning1, meaning2, meaning3' from dual 
    2 union all 
    3 select Q1 || ',' || Q2 || ',' || Q3 from dataTable; 

'MEANING1,MEANING2,MEANING3' 
-------------------------------------------------------------------------------- 
meaning1, meaning2, meaning3 
1,2,3 
4,5,6 
Verwandte Themen