Oracle SQL-从两个表映射属性

时间:2019-02-19 10:43:41

标签: sql oracle

我有两个表T1和T2。

T1->包含主要数据

T2->配置表

T1:

FILE | ATTRB1 | ATTRB2 | ATTRB3 | ATTRB4 |
  F1 |    0   |    2   |    4   |    6   |
  F1 |    1   |    3   |    5   |    7   |
  F2 |    7   |    8   |    9   |    0   |
  F2 |    1   |    2   |    3   |    4   |
  F3 |    0   |    2   |    0   |    4   |
  F3 |    1   |    0   |    3   |    0   |
  F4 |    3   |    6   |    9   |    0   |
  F4 |    4   |    8   |    1   |    2   |

T2:

ATTRB_ID | ATTRB_NAME |   COLUMN  | TABLE_REF |
    1    |    WORDS   |   ATTRB1  |     T1    |
    2    |    CHARS   |   ATTRB2  |     T1    |
    3    |    MATCH   |   ATTRB3  |     T1    |
    4    |    SPACES  |   ATTRB4  |     T1    |

注意:T1和T2之间的映射使用COLUMN属性和TABLE_REF。如果TABLE_REF是T1,则其中的记录将引用T1。

结果表:

FILE |  WORDS |  CHARS |  MATCH | SPACES |
  F1 |    0   |    2   |    4   |    6   |
  F1 |    1   |    3   |    5   |    7   |
  F2 |    7   |    8   |    9   |    0   |
  F2 |    1   |    2   |    3   |    4   |
  F3 |    0   |    2   |    0   |    4   |
  F3 |    1   |    0   |    3   |    0   |
  F4 |    3   |    6   |    9   |    0   |
  F4 |    4   |    8   |    1   |    2   |

我们如何使用oracle SQL达到以上结果?

任何有关此主题的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

取消取消T1中的数据,与T2合并,再次进行透视:

select *
  from (
    select rn, file_, val, attrb_name
      from (select * from (select rownum rn, t1.* from t1) 
                           unpivot (val for attr in (ATTRB1, ATTRB2, ATTRB3, ATTRB4))) t1
      left join t2 on t2.col = t1.attr)
  pivot (max(val) for attrb_name in ('WORDS', 'CHARS', 'MATCH', 'SPACES'))
  order by rn

dbfiddle demo

答案 1 :(得分:0)

您可以创建一个返回游标的函数

create or replace function query2 (p_table varchar2) 
   return sys_refcursor 
is 
   rf_cur   sys_refcursor; 
   sql_stm varchar2(4000); 
begin 

  select 'SELECT ' || listagg('"'||column_name||'"' || nvl2(attrb_name,' as "'||attrb_name||'"',''),',') within group (order by column_id) ||' FROM '||p_table  into sql_stm 
  from user_tab_columns  
  left join t2 on column_name = "COLUMN" 
  where table_name = p_table; 
 dbms_output.put_line(sql_stm);
   open rf_cur for sql_stm; 
   return rf_cur; 
end query2; 

用法:select query2('T1') from dual;