请提供帮助!这是问题所在:
交易表(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 = '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,尽管我怀疑这可能不会有很大的不同。
答案 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。通常最好是找到一种更简单的方法来解决问题。