簡體   English   中英

如何在Oracle中將兩個或多個未知表合並為一個表

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

我正在嘗試將x個相同的表合並到一個表中。 這樣做的原因是因為我們想要在數據庫中每個表擁有50個列。 表格是通過名為Ignition的SCADA軟件在外部創建的。

每次在數據庫中創建表時,我們都希望將數據視為一個表,而與數據來自多少表無關,只要所有表的前三個字母相同,例如Table_1,Table_2,Table_3 .... so上。

我們想要的查詢/過程如下:步驟1:由於表是未知的,因此無法通過簡單的並集,合並插入等操作來完成,因此我們必須找到所有帶有“ Table”前綴的table_name。

從all_tables中選擇table_name,其中table_name如'Table%'

步驟2:這就是魔術的開始,第一步,它應該對列出的table_name逐個查詢,然后收集所有數據並合並到一個表或視圖中。

我使用PL / SQL嘗試了許多方法,但是不知道如何執行步驟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中的簡單分配來附加每個選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM