Oracle SQL - отображение атрибутов из двух таблиц - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть две таблицы 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 голосов
/ 19 февраля 2019

Вы можете создать функцию, которая возвращает курсор

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;

0 голосов
/ 19 февраля 2019

Удалить данные из 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...