postgresql中具有相同前缀的联合表
Union tables with same prefix in postgresql
我在 postgres 数据库的模式(不是 public)中有多个 table 前缀为“tb_”。我想创建一个新的 table 作为所有这些带有前缀“tb_”的 table 的联合。所有 table 都具有相同的结构并且没有重复。我可以使用下面的 SQL 语句手动完成。
CREATE TABLE schema1.tb
AS
SELECT *
FROM schema1.tb_1
UNION
SELECT *
FROM schema1.tb_2
UNION
SELECT *
FROM schema.tb_3
但是,我想自动化,因为有很多 table。也许 PL/pgSQL 是可能的。我不知道编写 PLSQL 代码,因此在这里寻求帮助。
另外,在创建新的 table 之后,我想删除所有前缀为“tb_”的 table。
以下是我基于 spatialhast
的 answer 的尝试
CREATE OR REPLACE FUNCTION maskunion(IN _schema TEXT, IN _parttionbase TEXT, TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
EXECUTE 'DROP TABLE IF EXISTS ' || ;
EXECUTE 'CREATE TABLE ' || || '
(
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision
)';
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'INSERT INTO ' || || ' SELECT * FROM ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT maskunion('schema1', 'tb_', 'schema1.new_table');
以下是基于 spatialhast answer 的解决方案之一。
CREATE OR REPLACE FUNCTION maskunion(IN _schema TEXT, IN _parttionbase TEXT, TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
EXECUTE 'DROP TABLE IF EXISTS ' || ;
EXECUTE 'CREATE TABLE ' || || '
(
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision
)';
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'INSERT INTO ' || || ' SELECT * FROM ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT maskunion('schema1', 'tb_', 'schema1.new_table');
我在 postgres 数据库的模式(不是 public)中有多个 table 前缀为“tb_”。我想创建一个新的 table 作为所有这些带有前缀“tb_”的 table 的联合。所有 table 都具有相同的结构并且没有重复。我可以使用下面的 SQL 语句手动完成。
CREATE TABLE schema1.tb
AS
SELECT *
FROM schema1.tb_1
UNION
SELECT *
FROM schema1.tb_2
UNION
SELECT *
FROM schema.tb_3
但是,我想自动化,因为有很多 table。也许 PL/pgSQL 是可能的。我不知道编写 PLSQL 代码,因此在这里寻求帮助。
另外,在创建新的 table 之后,我想删除所有前缀为“tb_”的 table。
以下是我基于 spatialhast
的 answer 的尝试CREATE OR REPLACE FUNCTION maskunion(IN _schema TEXT, IN _parttionbase TEXT, TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
EXECUTE 'DROP TABLE IF EXISTS ' || ;
EXECUTE 'CREATE TABLE ' || || '
(
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision
)';
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'INSERT INTO ' || || ' SELECT * FROM ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT maskunion('schema1', 'tb_', 'schema1.new_table');
以下是基于 spatialhast answer 的解决方案之一。
CREATE OR REPLACE FUNCTION maskunion(IN _schema TEXT, IN _parttionbase TEXT, TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
EXECUTE 'DROP TABLE IF EXISTS ' || ;
EXECUTE 'CREATE TABLE ' || || '
(
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision
)';
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'INSERT INTO ' || || ' SELECT * FROM ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT maskunion('schema1', 'tb_', 'schema1.new_table');