在另一个表的 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_2
和 col_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 子句中使用一个表中的列值的主要内容,如果未能解决你的问题,请参考以下文章