在另一个表的 select 子句中使用一个表中的列值

Posted

技术标签:

【中文标题】在另一个表的 select 子句中使用一个表中的列值【英文标题】:Using column values from one table within a select clause from another table 【发布时间】: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 相同 【参考方案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。

以上是关于在另一个表的 select 子句中使用一个表中的列值的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询中使用外部查询中的列从另一个表中获取结果?

如何从表中选择哪个名称存储在另一个表中带有“0”前缀的列中

SQL 语句的解析过程

如何在 select 语句中使用索引?

从数据表中检索信息

Linq to Entities 添加 Where 子句以在另一个表中查找 EXISTS