Получить данные из столбцов одной таблицы, имена которых являются значениями другой таблицы - PullRequest
1 голос
/ 12 июня 2019

Мне нужно выбрать столбцы из основной таблицы, а список столбцов, которые мне нужно получить, будет в таблице метаданных для разных пользователей. Это должно быть динамическим, поскольку у каждого пользователя может быть разное количество столбцов. быть доставленным.

Таблица метаданных

User    short_desc
rk      sector
rk      Industry
pa      sector
pa      Industry
pa      Subindustry

Таблица основных данных

ID          sector              Industry                  Subindustry
594918104   Technology          Information Technology    CyberSecurity
G0464B107   Financial Services  Financials                Banks

Когда пользователь rk выбран из мета-таблицы, я хотел бы получить только сектор и отрасль Когда выбран пользователь pa, я бы хотел получить только сектор, отрасль и отрасль.

Попробовал это из еще одного решения, но это не динамично.

SELECT t2.user_id,
       t1.attr_name,
       CASE
          WHEN t1.attr_path = 'str1' THEN t2.str1
          WHEN t1.attr_path = 'str2' THEN t2.str2
       END
          col_sel
  FROM metadata t1 INNER JOIN class t2 ON t1.org_id = t2.org_id
 WHERE t1.org_id = 1

Когда пользователь rk выбран из мета-таблицы, я бы хотел получить только сектор и отрасль Когда выбран пользователь pa, я бы хотел получить только сектор, отрасль и отрасль.

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Выберите все столбцы, но верните значения NULL в этих столбцах, если у пользователя нет прав доступа к метаданным:

Установка Oracle :

CREATE TABLE metadata ( org_id, Username, short_desc ) AS
SELECT 1, 'aa', 'Industry'    FROM DUAL UNION ALL
SELECT 1, 'rk', 'sector'      FROM DUAL UNION ALL
SELECT 1, 'rk', 'Industry'    FROM DUAL UNION ALL
SELECT 1, 'pa', 'sector'      FROM DUAL UNION ALL
SELECT 1, 'pa', 'Industry'    FROM DUAL UNION ALL
SELECT 1, 'pa', 'Subindustry' FROM DUAL;

CREATE TABLE master ( org_id, ID, sector, Industry, Subindustry ) AS
SELECT 1, '594918104', 'Technology',         'Information Technology', 'CyberSecurity' FROM DUAL UNION ALL
SELECT 1, 'G0464B107', 'Financial Services', 'Financials',             'Banks'         FROM DUAL

Запрос

SELECT md.username,
       m.id,
       NVL2( md.sector,      m.sector,      NULL ) AS sector,
       NVL2( md.industry,    m.industry,    NULL ) AS industry,
       NVL2( md.subindustry, m.subindustry, NULL ) AS subindustry
FROM   ( SELECT *
         FROM   metadata
         PIVOT ( MAX(1) FOR short_desc IN (
           'sector'      AS sector,
           'Industry'    AS industry,
           'Subindustry' AS subindustry
         ) ) ) md
       INNER JOIN master m
       ON ( md.org_id = m.org_id )
WHERE  md.org_id = 1

Выходы

USERNAME | ID        | SECTOR             | INDUSTRY               | SUBINDUSTRY  
:------- | :-------- | :----------------- | :--------------------- | :------------
rk       | G0464B107 | Financial Services | Financials             | <em>null</em>         
rk       | 594918104 | Technology         | Information Technology | <em>null</em>         
aa       | G0464B107 | <em>null</em>               | Financials             | <em>null</em>         
aa       | 594918104 | <em>null</em>               | Information Technology | <em>null</em>         
pa       | G0464B107 | Financial Services | Financials             | Banks        
pa       | 594918104 | Technology         | Information Technology | CyberSecurity

дБ <> скрипка здесь

1 голос
/ 12 июня 2019

Один из вариантов - использовать функцию, которая возвращает курсор ref.

Контрольный пример:

SQL> select * from metadata;

C_ SHORT_DESC
-- --------------------
rk sector
rk industry
pa industry
pa sector
pa subindustry

SQL> select * from master_data;

ID         SECTOR          INDUSTRY             SUBINDUSTRY
---------- --------------- -------------------- ---------------
5949       technology      information tech     cyber security
g046       financial       financials           banks

Функция:

SQL> create or replace function f_meta (par_user in varchar2)
  2    return sys_refcursor
  3  is
  4    l_str varchar2(200);
  5    rc    sys_refcursor;
  6  begin
  7    select listagg(short_desc, ', ') within group (order by null)
  8      into l_str
  9      from metadata
 10      where c_user = par_user;
 11
 12    l_str := 'select ' || l_str ||' from master_data';
 13
 14    open rc for l_str;
 15    return rc;
 16  end;
 17  /

Function created.

Проверка:

SQL> select f_meta('rk') from dual;

F_META('RK')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

INDUSTRY             SECTOR
-------------------- ---------------
information tech     technology
financials           financial


SQL> select f_meta('pa') from dual;

F_META('PA')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

INDUSTRY             SECTOR          SUBINDUSTRY
-------------------- --------------- ---------------
information tech     technology      cyber security
financials           financial       banks


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