如何在Oracle中将两个或多个未知表合并为一个表

时间:2019-02-04 06:01:11

标签: oracle

我正在尝试将x个相同的表合并到一个表中。这样做的原因是因为我们想要在数据库中每个表拥有50个列。可以通过名为Ignition的SCADA软件在外部创建表格。

每个时间表都是在数据库中创建的,我们希望将数据视为一个表,而不考虑数据来自多少个表,只要所有表的前三个字母相同,例如Table_1,Table_2,Table_3。 ..等等。

我们想要的查询/过程如下: 步骤1:由于表格未知,我们无法通过简单的并集,合并插入等操作来完成,因此我们必须找到所有带有“ Table”前缀的表格名称。

从所有表中选择表名,其中表名类似于“表%”

步骤2:这就是魔术的开始,第一步,它应该对列出的table_name逐个查询,然后收集所有数据并合并到一个表或视图中。

我尝试了使用PL / SQL的多种方法,但不知道如何执行步骤2。是否有任何方法可以获得我们想要实现的目标?任何可能的解决方案都将很棒! :)

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您仅从所有表中选择公共列,则可以创建一个动态视图,该视图对所有以“ Table”前缀开头的表进行UNION ALL

DECLARE
     v_select   CLOB;
BEGIN
     SELECT
          LISTAGG('SELECT col1,col2,col3 FROM ' || table_name,
                  ' UNION ALL ' || CHR(10) ) WITHIN GROUP
          (
               ORDER BY table_name
          )
     INTO v_select
     FROM user_tables WHERE table_name LIKE 'TABLE_%';
     IF
          v_select IS NOT NULL
     THEN
          EXECUTE IMMEDIATE ' CREATE OR REPLACE VIEW v_all_tabs as ' || v_select;
     END IF;
END;
/

然后,每次添加新表时,通过执行上述块(或将其放入过程)从视图中进行选择。

select * from v_all_tabs;

如果您的SQL字符串有可能超过4000个字符,而不是一个LISTAGG,,则可以通过游标循环中的PL / SQL中的简单分配来附加每个选择。