Запросить таблицу и имя столбца, хранящиеся в таблице - PullRequest
0 голосов
/ 24 апреля 2018

Я приехал сюда из-за проблемы, с которой у меня недостаточно опыта в Базе данных Oracle.Позвольте мне объяснить:

Таблицы

У меня есть таблица, которую мы будем называть Атрибуты , содержащей 3 столбца: ID , идентификатор атрибута, -EDIT: Entity_ID, а также сущность, к которой он относится / EDIT- , имя_таблицы , содержащее имятаблица, в которой хранится значение атрибута, и имя столбца , содержащее имя столбца в той таблице, в которой хранится значение.

Everyтаблицы, на которые есть ссылки в столбце имя_таблицы , содержат те же имена столбцов (например, Value1 , Value2 и т. д.), за исключениемпервый, который ссылается на другую сущность ( Entity_id ), с которой связан атрибут.

Что я ищу

Моя цельпостроить запрос, который выбирает каждый атрибут (на основе его идентификатора) и его значение.Но я не знаю, как это сделать, так как имя таблицы и столбца меняется.Есть ли способ использовать переменные?Но если так, как я могу поместить их в запрос, чтобы он автоматически изменялся для каждой строки?

РЕДАКТИРОВАТЬ

ПРИМЕР

ATTRIBUTES table
ID         ENTITY_ID      TABLE_NAME   COLUMN_NAME
---------- -------------- ------------ -----------
1          3              Values_A     Value_1  
2          2              Values_B     Value_3
3          2              Values_A     Value_2

VALUES_A table
ENTITY_ID  Value_1        Value_2      Value_3
---------- -------------- ------------ -----------
1          Monday         42           Green
2          Sunday         3000         Blue
3          Wednesday      1            Black

VALUES_B table
ENTITY_ID  Value_1        Value_2      Value_3
---------- -------------- ------------ ------------
1          Tuesday        26           Green
2          Saturday       3            Red
3          Wednesday      15           White

Таким образом, результат, который я ищу, будет:

RESULT:
ID        Value
--------- -----------
1         Wednesday
2         Red
3         3000  

Извините, если смотреть на это больно, его было так же больно (не нашел, как лучше отформатировать его)

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Использование запроса Питера М для построения текста SQL, а затем использование темной силы XML:

create table attributes (id, entity_id, table_name, column_name)
as
select 1, 3, 'VALUES_A', 'VALUE_1' from dual union all
select 2, 2, 'VALUES_B', 'VALUE_3' from dual union all
select 3, 2, 'VALUES_A', 'VALUE_2' from dual;

create table values_a (entity_id, value_1, value_2, value_3)
as
select 1, 'Monday', 42, 'Green' from dual union all
select 2, 'Sunday', 3000, 'Blue' from dual union all
select 3, 'Wednesday', 1, 'Black' from dual;

create table values_b (entity_id, value_1, value_2, value_3)
as
select 1, 'Tuesday', 26, 'Green' from dual union all
select 2, 'Saturday', 3, 'Red' from dual union all
select 3, 'Wednesday', 15, 'White' from dual;

Запрос:

with queries as
     ( select table_name, column_name, entity_id
            , 'select '|| column_name || ' as c from ' || table_name ||
             ' where entity_id = ' || entity_id ||
              case
                  when id = max_id then ''
                  else ' union all '
              end as sqltext
       from 
           ( select a.*, max(a.id) over (order by id) max_id from attributes a ) )
select table_name, column_name, entity_id
     , extractvalue(xmltype(dbms_xmlgen.getxml(sqltext)),'/ROWSET/ROW/C') as sql_result
from   queries;

Результаты:

TABLE_NAME COLUMN_NAME  ENTITY_ID SQL_RESULT
---------- ----------- ---------- ---------------------------------------------------
VALUES_A   VALUE_1              3 Wednesday
VALUES_B   VALUE_3              2 Red
VALUES_A   VALUE_2              2 3000
0 голосов
/ 24 апреля 2018

это некрасиво

, но это сгенерирует SQL-оператор, который вы можете запустить, может быть, это не то, что вы хотите

select 'select '|| column_name || ' from ' || table_name || ' where entity_id = ' || entity_id || case when id = max_id then '' else ' union all ' end
from 
  (select a.*, max(a.id) over (order by id) max_id 
   from attributes a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...