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

问题描述 投票:1回答:1

需要帮助!这是问题所在:

  • 我有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中COLUMN的条目引用表A中的实际列名称(i.i.qazxsw poi指的是A.DATE)

问题是,我需要编写一个查询来获取表B中的所有COLUMN值,并从表A中选择相应的分组值。例如:

  • 因为B.COLNAME = 'DATE'包含'DATE',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'

我可能会期待类似的东西:

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

  • 理想情况下,如果可能的话,我只尝试在原始SQL中执行此操作(即没有存储过程,PL / SQL,动态等等)但是......我绝对愿意接受任何可以使其工作的东西。
  • 非常感谢输入和/或建议。环境是Oracle 11g我相信,虽然我怀疑这可能不会产生巨大的差异。
sql oracle
1个回答
0
投票

可以在SQL中运行动态SQL,但解决方案很痛苦。最简单的方法是使用'SAMPLE TRANSACTION', 'FEB.15 2019'包,不需要任何额外的PL / SQL对象。

以下示例有效,但不切实际。真正的版本必须处理许多类型转换问题,检索其他值等。

DBMS_XMLGEN

结果基于此示例模式:

--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; 。该程序允许SQL中的动态SQL,但它需要首先安装一些新对象。

实际上,这种级别的动态SQL很少是必需的。通常最好找到一种更简单的方法来解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.