[英]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.