【问题标题】:How to merge two or more unknown tables into one table in OracleOracle中如何将两个或多个未知表合并为一张表
【发布时间】:2019-02-04 06:01:10
【问题描述】:

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

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

我们想要的查询/过程是这样的: 第1步:由于表是未知的,我们不能通过简单的联合,合并插入等来完成,所以我们必须找到所有带有'Table'前缀的table_name。

SELECT table_name FROM all_tables where table_name like 'Table%'

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

我尝试了许多使用 PL/SQL 的方法,但不知道如何继续第 2 步。有什么方法可以实现我们想要实现的目标吗?任何可能的解决方案都会很棒! :)

谢谢!

【问题讨论】:

    标签: oracle


    【解决方案1】:

    假设您只从所有表中选择公共列,您可以创建一个动态视图,它对所有以“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 中的简单赋值来附加每个选择。

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多