你不能这样做,在一个命令,你需要首先执行一个打造你想要的SELECT
声明,并复制它的结果,并执行它:
SELECT string_agg(
format('(SELECT * FROM %I.ref_product)', nspname),
' UNION ALL ')
FROM pg_namespace
WHERE nspname !~ '^(pg_.*|information_schema|public)$';
另一种选择是使用PL/pgSQL的EXECUTE
命令,例如:
CREATE OR REPLACE FUNCTION ref_product()
RETURNS SETOF tenant1.ref_product
LANGUAGE plpgsql STABLE AS $$
DECLARE
v_cmd text;
BEGIN
SELECT string_agg(
format('(SELECT * FROM %I.ref_product)', nspname),
' UNION ALL ')
INTO v_cmd
FROM pg_namespace
WHERE nspname !~ '^(pg_.*|information_schema|public)$'
RETURN QUERY EXECUTE v_cmd;
END;
$$;
最后,如果你经常使用这一点,考虑创建另一个模式(让我们说“tenant_all”)使用相同的表定义,并设置所有其它表作为儿童它使用PostgreSQL的INHERTIS
。例如:
CREATE SCHEMA tenant_all;
CREATE TABLE tenant_all.ref_product(LIKE tenant1.ref_product);
ALTER TABLE tenant1.ref_product INHERIT (tenant_all.ref_product);
ALTER TABLE tenant2.ref_product INHERIT (tenant_all.ref_product);
ALTER TABLE tenant3.ref_product INHERIT (tenant_all.ref_product);
...
ALTER TABLE tenantN.ref_product INHERIT (tenant_all.ref_product);
所以这样你可以简单的查询tennat_all.ref_product
,它会工作完全一样,如果要查询其一个与UNION ALL
追加。
当然,在所有情况下,我假设表格模式匹配完美。
我希望'table_schema'会返回'tenant1,tenant2,tenant3',对吗? – 2015-04-02 09:36:34
@unique_id yup。它会返回它。 – user962206 2015-04-02 09:39:34
只显示表'ref_product'的结构(创建脚本)? – 2015-04-02 09:51:52