Oracle SQL-使用一个表中的列名作为另一个表中的查询参数

时间:2019-02-15 05:34:51

标签: sql oracle

请提供帮助!这是问题所在:

  • 我有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.

  • 在这种情况下,表B中COLNAME的条目引用表A中的实际列名(即B.COLNAME = 'DATE'引用A.DATE)

问题是,我需要编写一个查询来提取表B中的所有COLNAME值,然后从表A中选择它们的相应分组值。例如:

  • 因为B.COLNAME包含“日期”,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')-不是我实际需要的派生值,如果我要手动运行查询,则为{{1} }

我可能期望像这样:

select NAME, DATE AS COL from TABLE_A;(例如NAME, COL

  • 理想情况下,如果可能(例如,没有存储过程,PL / SQL,动态等),则仅尝试在原始SQL中执行此操作,但是...绝对欢迎任何可以做到的事情工作。

  • 的输入和/或建议将非常感谢。我相信环境是Oracle 11g,尽管我怀疑这可能不会有很大的不同。

1 个答案:

答案 0 :(得分:0)

可以在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。通常最好是找到一种更简单的方法来解决问题。