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

How to merge two or more unknown tables into one table in Oracle

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

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

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

从所有表中选择table_name,其中table_name如'Table%'

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

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

谢谢!


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
/

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

1
select * from v_all_tabs;

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