【问题标题】:Using column values from one table within a select clause from another table在另一个表的 select 子句中使用一个表中的列值
【发布时间】:2016-05-24 14:17:28
【问题描述】:

我有一个名为:col_mapping 的 Oracle 表,其中该表中的列包含另一个表中列的列值。

表格数据示例:col_mapping

    ID    DESCR     COL_VALS
------------------------------
    1     LABEL     COL_1
    2     NAME_ADDR COL_2:COL_3
    3     SALARY    COL4

基于上表,我现在想遍历 col_mapping 中的每条记录,并将 COL_VALS 用作我的一部分

select COL_VALS from other_tab

显然,如果像 COL_2:COL_3 这样的值不止一个,则需要将 ':' 替换为 ','

    SELECT COL_1 from other_tab;
    SELECT COL_2,COL_3 from other_tab;
    SELECT COL_4 from other_tab;

【问题讨论】:

  • 您只是想将这些选择语句生成为字符串,还是实际执行它们?要执行它们,您需要某种形式的动态 SQL;您将如何处理查询结果?此外,descr 列是否相关 - 它是否应该是查询列的别名,如果是,第二个是否应该将 col_2col_3 组合成一个值?
  • @Alex Poole 我实际上想生成这些选择语句,并将这些列的实际值放在 other_tab 表中的临时表中。 descr 列只是让我知道 col_vals 中的内容,因此对于 col_2 和 col_3,我实际上希望将它们作为单独的值。希望这可以帮助。谢谢。
  • 您的暂存表是否与other_tab 具有相同的列名和数据类型?如果不是,您如何映射和转换值?
  • @Alex Poole - 暂存表将与 other_tab 相同

标签: plsql oracle11g oracle-apex


【解决方案1】:

您可以使用动态 SQL 在 col_mappings 行上的游标循环内基于 col_vals 值生成和执行插入语句:

begin
  for r in (select replace(col_vals, ':', ',') as cols from col_mapping) loop
    dbms_output.put_line('insert into staging_tab(' || r.cols || ')'
      || ' select ' || r.cols || ' from other_tab');
    execute immediate 'insert into staging_tab(' || r.cols || ')'
      || ' select ' || r.cols || ' from other_tab';
  end loop;
end;
/

光标只是获取cols_val 值,用逗号替换冒号。生成的插入将修改后的 cols_val 用作插入列列表和选择列表 - 因为您说临时表将匹配 other_tab 结构。

dbms_output 行只是为了让您可以查看生成的语句 - 代码不需要运行,您需要set serveroutput on 或等效项才能看到它。启用该功能后,使用您的示例映射数据运行该块显示:

PL/SQL procedure successfully completed.

insert into staging_tab(COL_1) select COL_1 from other_tab
insert into staging_tab(COL_2,COL_3) select COL_2,COL_3 from other_tab
insert into staging_tab(COL4) select COL4 from other_tab

您最终会得到来自other_tab 中每一行的数据分布在staging_tab 中的多行中,其中包含大量空值。希望这就是您的意图。

【讨论】:

  • 谢谢@Alex Poole - 会看看并告诉你。
  • 谢谢@Alex Poole - 一切看起来都不错,但我必须创建一个新线程,因为我现在需要在 where 条件中包含 COL_VALS。
猜你喜欢
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
相关资源
最近更新 更多