【问题标题】:Oracle SQL - using column name in one table as query parameter within anotherOracle SQL - 使用一个表中的列名作为另一个表中的查询参数
【发布时间】:2019-07-09 05:40:55
【问题描述】:

请帮助!问题来了:

  • 我有 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 或根本不这样做。
  • 谢谢!几乎把它钉在了...

标签: sql oracle


【解决方案1】:

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

【讨论】:

  • 这些绝对是放在口袋里的好选择(不知道这些)...谢谢!!
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 2015-01-29
  • 1970-01-01
  • 2012-04-24
  • 2013-12-14
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多