2017-07-19 117 views
0

我繼承了一個具有288個表的特定模式的數據庫。這些表格全部與正好相同的列名稱。我想在合併1在一個postgresql中合併多個表

我第一次嘗試所有這些288個表格是CREATE TABLE AS

CREATE TABLE bigTable AS SELECT X.* FROM (SELECT tablename FROM pg_tables WHERE tablename LIKE '%xxx') AS X 

但是,這顯然是行不通的。

於是,我試着用PLPGSQL腳本:

DO $$ 
DECLARE 
    r RECORD; 
BEGIN 
    FOR r in (SELECT tablename FROM pg_tables WHERE tablename LIKE '%iti') LOOP 
    INSERT INTO xxx(gid, shape_len, geom) 
    SELECT * FROM r; 
    END LOOP; 
END; 
$$; 

但它告訴我,它不知道什麼r是。

我想我錯過了一些關於pg如何處理這種事情的東西。

回答

0

當你動態創建的語法,使用Execute命令執行字符串數據提供的SQL。 我剛剛製作了3個帶有示例值的表格,並製作了使用此語句填充的第4個表格

DO $$ 
DECLARE 
    tbl_name text; 
BEGIN 
    FOR tbl_name IN  (SELECT tablename FROM pg_tables WHERE tablename LIKE 'table%') LOOP 
    execute 'INSERT INTO table4 select * FROM '||tbl_name; 
    END LOOP; 

END; 
$$ 
0

使用此shell腳本來獲取所有表並插入到新表

#!/bin/bash 

psql **DATABASE_NAME** -c "select tablename from pg_tables where 
schemaname='public'" | sed 1,2d | head -n -2 > hello.out 

while read line; 
do 
psql **DATABASE_NAME** -c "insert into **TABLE_NAME** (select * from $line)" 
done < hello.out