запрос из таблиц, где имя таблицы находится в текущем запросе - PullRequest
0 голосов
/ 30 января 2019

У меня есть этот запрос: select main_value, subtable, subtable_column from table1

Я хочу знать, могу ли я запрашивать значения из subtable в то время, когда этот запрос выполняется?

EDIT ----

структура таблицы1

main_value varchar
subtable varchar
subtable_column varchar

структура ветвей (подтаблица в запросе)

id number
branch_name varchar

при запросе из таблицы1 и при получении значения подтаблицыкак branches, а значение subtable_column как branch_name, а затем запросить имя_ветвления из ветвей (потому что значение столбца подтаблицы - это ветви, извлеченные из запроса и имен столбцов, наоборот).

РЕДАКТИРОВАТЬ для таблиц и примеров ---------------------------

table1

+-----------------+--------------------+  
| Field           | Type               |  
+-----------------+--------------------+  
| ID              | number(20,0)       |  
| subtable        | varchar2(50 BYTE)  |  
| subtable_column | varchar2(100 BYTE) |  
+-----------------+--------------------+  

branch

+-------------+-------------------+  
| Field       | Type              |  
+-------------+-------------------+  
| ID          | number(20,0)      |  
| branch_name | varchar2(50 BYTE) |  
+-------------+-------------------+  

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

у меня есть записи в таблице1, как показано ниже:

ID | subtable | subtable_column
-------------------------------
1  | branches | branch_nmae
2  | null     | null

и таблица ветвей, как показано ниже:

ID | branch_name |
------------------
1  | new york
2  | colombo

вывод:

+-------------+-------------------+---------------------------------+
| subtable    | subtable_column   | selected values from branches   |
+-------------+-------------------+---------------------------------+
| branches    | branch_name       | new york, colombo               |
| null        | null              |                                 |
+-------------+-------------------+---------------------------------+

Ответы [ 2 ]

0 голосов
/ 30 января 2019
SELECT DISTINCT
table1.id,
table1.subtable,
table1.subtable_column,
t.* 
FROM
table1
JOIN branches
LEFT JOIN ( SELECT group_concat( branch_name ) AS NAMES FROM branches ) AS t ON 1 = 1

это sql нормально ,, но менее эффективно

0 голосов
/ 30 января 2019

Если вы знаете все возможные таблицы и все возможные столбцы, которые могут содержать table1, вы можете построить запрос с case when, содержащим все возможности.Примерно так:

select id, subtable, subtable_column, 
       case 
       when subtable = 'branches' and subtable_column = 'branch_name' then 
         (select listagg(branch_name, ', ') within group (order by branch_name) 
            from branches) 
       when subtable = 'branches' and subtable_column = 'id' then 
         (select listagg(id, ', ') within group (order by id) 
            from branches) 
       end as subtable_values
  from table1;

Но более распространенным решением для таких проблем является использование динамического SQL.Поэтому напишите такую ​​функцию, как здесь:

create or replace function get_subtable_values(i_table in varchar2, i_column in varchar2)
  return varchar2 is

  v_sql varchar2(32767);
  v_ret varchar2(32767);
begin
  if i_table is null then
    return null;
  end if;

  v_sql := 'select listagg('||i_column||', '', '') within group (order by null) from '||i_table;
  execute immediate v_sql into v_ret;
  return v_ret;
end;

... и используйте ее в запросе:

select id, subtable, subtable_column, 
       get_subtable_values(subtable, subtable_column) as subtable_values
  from table1;

Мои тестовые данные и выходные данные для обоих запросов:

create table table1(id, subtable, subtable_column) as (
    select 1, 'branches', 'branch_name' from dual union all
    select 2, 'branches', 'id'          from dual union all
    select 3, null,       null          from dual); 

create table branches(id, branch_name) as (
    select 1, 'New York' from dual union all
    select 2, 'Colombo'  from dual );

Результат:

    ID  SUBTABLE  SUBTABLE_COLUMN  SUBTABLE_VALUES
------  --------  ---------------  --------------------
     1  branches  branch_name      Colombo, New York
     2  branches  id               1, 2
     3  null      null             null

Я использовал функцию listagg(), которая склеивает все значения в одну строку через запятую.Также возможно вернуть таблицу varchars или пользовательских типов.Конечно, может быть много проблем, таких как слишком длинные строки, типы данных, отличные от varchar, исключения должны обрабатываться и т. Д. Но вы видите, что это возможно.

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