Oracle SQL - использование имени столбца в одной таблице в качестве параметра запроса в другой - PullRequest
0 голосов
/ 15 февраля 2019

Нужна помощь, пожалуйста!Вот проблема:

  • У меня есть 2 таблицы (одна транзакция и один поиск / управление), как показано ниже:

таблица транзакций (A):

TXID, NAME, DESCRIPTION, GROUP, DATE, TYPE, AMOUNT, etc. 

(например, 12345, 'SAMPLE TRANSACTION','test','TXGROUP1','FEB.15 2019',500.00, etc.)

справочная / контрольная таблица (B):

COLID, COLNAME, FLAG

(например, 1,'NAME', 0; 2,'DATE',1, etc.)

  • InВ этом сценарии записи для COLNAME в таблице B относятся к фактическим именам столбцов в таблице A (т. е. B.COLNAME = 'DATE' относится к A.DATE)

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

  • , поскольку B.COLNAME содержит 'DATE', select max (DATE) from table A grouping by A.NAME

Что яя пробовал:

  • select NAME, (SELECT column_name FROM all_tab_columns where table_name like '%TABLE_A%' AND ROWNUM = 1 GROUP BY COLUMN_NAME) AS COL from TABLE_A;
  • , но это только дает мне буквальное значение имени столбца - (то есть 'SAMPLE TRANSACTION', 'DATE') - НЕ ПРОИЗВОДНОЕ ЗНАЧЕНИЕ, как в том, что яна самом деле нужно, если бы мне нужно было выполнить запрос вручную, было бы select NAME, DATE AS COL from TABLE_A;

, и я мог бы ожидать что-то вроде:

NAME, COL (например, 'SAMPLE TRANSACTION', 'FEB.15 2019')

  • В идеале я тстараюсь делать это только в сыром SQL, если это возможно (т.е. без хранимых процедур, PL / SQL, динамических и т. д.), но ... я определенно открыт для всего, что может заставить его работать.

  • ввод и / или предложения будут очень высоко оценены.Я считаю, что среда - это Oracle 11g, хотя я подозреваю, что это не имеет большого значения.

1 Ответ

0 голосов
/ 03 марта 2019

Это возможно для запуска динамического SQL в SQL, но решения болезненны.Самый простой способ использует пакет DBMS_XMLGEN и не требует никаких дополнительных объектов PL / SQL.

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

--Read a value based on the CONTROL table.
select
    to_number(extractvalue(xml, '/ROWSET/ROW/COL')) COL
from
(
    select xmltype(dbms_xmlgen.getxml(v_sql)) xml
    from
    (
        select 'select '||colname||' col from transaction' v_sql
        from control
    )
);

COL
---
  2

Результаты основаны на этом примере схемы:

--Sample schema:
create table control
(
    COLID number,
    COLNAME varchar2(4000),
    FLAG number
);
insert into control values(1,'NAME',1);

create table transaction
(
    TXID number,
    NAME varchar2(100),
    DESCRIPTION varchar2(4000),
    the_GROUP varchar2(100),
    the_DATE date,
    TYPE varchar2(100),
    AMOUNT number
);
insert into transaction values(1,2,3,4,sysdate,6,7);
commit;

Если у вас есть большесложный запрос требует, например, если вам нужно вернуть неизвестное количество столбцов, вам нужно установить что-то вроде моей программы с открытым исходным кодом Method4 .Эта программа допускает динамический SQL в SQL, но для этого требуется сначала установить несколько новых объектов.

На практике такой уровень динамического SQL редко требуется.Обычно лучше найти более простой способ решения проблемы.

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