Oracle SQL: нужна помощь, как можно получить ниже - PullRequest
0 голосов
/ 12 июня 2019

У меня есть 2 таблицы.Одним из них является таблица данных, а другим - таблица сопоставления.Таблица сопоставления содержит такие поля, как TYPE, ATTRIBUTE и DESTINATION.Таблица сопоставления указывает, для конкретного типа, какой атрибут представлен в каком столбце таблицы данных

DATA_TABLE

TYPE    Data_field1    data_field2   data_field3  
-------------------------------------------------
abc       1234           5678         4321         
def       5679           1235         9877          

Mapping_Table

TYPE     Attribute    destination
--------------------------------------
abc      emp_id           data_field1
abc      dept_id          data_field2
abc      ph_no            data_field3 
def      emp_id           data_field2
def      dept_id          data_field3
def      ph_no            data_field1

Я хочу получить результат, как показано ниже,

Result_Table

Type     emp_id    dept_id    ph_no
------------------------------------------------
abc      1234       5678      4321
def      1235       9877      5679

Я попробовал, как показано ниже,

Select Case when type='abc' then data_field1 
            when type='def' then data_field2 end emp_id,
       case when type='abc' then data_field2
            when type='def' then data_field3 end dept_id,
       case when type='abc' then data_field3
            when type='def' then data_field1 end ph_no
from data_table;

Я вручную проверил TYPE и DESTINATION конкретного ATTRIBUTE из MAPPING_TABLE и сделал вышеуказанный запрос.Проблема в том, что у меня более 50 ТИПОВ, а для каждого ТИПА почти 100 АТРИБУТОВ.Поэтому я не могу сделать запрос, как описано выше, для всех типов.

Так что ожидаю простого или лучшего решения

Заранее спасибо

1 Ответ

0 голосов
/ 14 июня 2019

Согласитесь с приведенными выше комментариями, что это не очень хороший дизайн таблицы, однако, если у вас нет другого выбора, кроме как работать с этим, я был бы склонен использовать динамическое решение SQL (ниже не протестировано и может содержать синтаксические ошибки, но следует быть хорошей отправной точкой).

В этом решении предполагается, что все типы будут иметь одинаковые поля (и у всех типов будет определение для всех полей).

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

declare
  v_sql_string varchar2(32000);
  v_first_row boolean default true;      
  v_current_type varchar2(3) default null;

  cursor c_types is 
  select * from mapping_table
  order by type, attribute;

begin
  for v_row in c_mappings loop
    if v_fisrt_row then
       v_sql_string := 'Select ';
       v_current_type := v_row.type;
    else 
       if v_curent_type != v_row.type then           
         v_sql_string := 'Union select ';
       end if;
    end if;

    if v_first_row then
      v_sql_string := v_sql_string || ' as ' || attribute ';
    else
      v_sql_string := ', ' || v_sql_string || ' as ' || attribute ';
    end if;
  end loop;
  dbms_output.put_line(v_sql_string);  
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...