sql - Oracle SQL - 使用一个表中的列名作为另一个表中的查询参数
问题描述
请需要帮助!这是问题所在:
- 我有 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'
)-而不是我实际需要的派生值,如果我要手动运行查询将是select NAME, DATE AS COL from TABLE_A;
我可能会期待这样的事情:
NAME, COL
(例如'SAMPLE TRANSACTION', 'FEB.15 2019'
)
理想情况下,如果可能的话,我只尝试在原始 SQL 中执行此操作(即没有存储过程、PL/SQL、动态等......)但是......我绝对愿意接受任何可以让它工作的东西。
非常感谢您的意见和/或建议。我相信环境是Oracle 11g,尽管我怀疑这可能不会有太大的不同。
解决方案
可以在 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。通常最好找到一种更简单的方法来解决问题。
推荐阅读
- firebase - 如何从 StatefulWidget 子类向 StatelessWidget 发送数据或值?
- javascript - 如何将 JSON 响应解构为表格?
- google-apps-script - 一切正常,但主题行空白......为什么?我错过了什么?
- python - 运行以下代码时,我收到此错误“分配前引用的局部变量 'col'”:
- security - 如何将 Tomcat 9 中的 JSP 文件限制为仅在一个子目录 /jsp 中运行
- python - 迭代地将第一列中的文本与其他列中的现有文本组合
- python - 在 Pandas 数据框中查找团队内的相关分数
- python - 如何防止类外的属性访问?
- flutter - Audio_cache(audioplayers 包)无法在 android 中播放音频文件
- javascript - Phaser 3 中的网络音频无法在 iOS 上播放?