PostgreSQL-组合查询

PostgreSQL-组合查询,postgresql,select,Postgresql,Select,我有一个查询,我想与另一个查询合并,但没有成功 第一个查询返回表名为status的所有架构名称: 每个状态表中都有一列lastLogin,可按如下方式选择: select "lastLogin" from "someID".status where "lastLogin" is not null 如何从每个模式的所有状态表中获取lastLogin的所有值 提前感谢,Doobie您不能这样做,因为SQL查询中的模式名称必须是常量。您必须根据第一个查询的结果构造第二个查询 您可以做的是构

我有一个查询,我想与另一个查询合并,但没有成功

第一个查询返回表名为status的所有架构名称:

每个状态表中都有一列lastLogin,可按如下方式选择:

select "lastLogin" 
from   "someID".status 
where  "lastLogin" is not null
如何从每个模式的所有状态表中获取lastLogin的所有值


提前感谢,Doobie

您不能这样做,因为SQL查询中的模式名称必须是常量。您必须根据第一个查询的结果构造第二个查询


您可以做的是构造第二个查询,以便它使用UNION在单个查询中查询所有名为status的表。

对于方案数未知的一般问题,您无法创建单个查询。但是您可以为此创建一个存储过程。我假设lastLogin具有类型TIMESTAMP

自Postgres 9.5以来,内环可缩短为:

CREATE FUNCTION list_last_logins() RETURNS SETOF TIMESTAMP AS $$
DECLARE
    the_row RECORD;
    the_statement TEXT;
BEGIN
    FOR the_row IN SELECT t.schema_name FROM information_schema.tables t WHERE t.table_name = 'status'
    LOOP
        the_statement := FORMAT('SELECT "lastLogin" FROM %s.status WHERE "lastLogin" IS NOT NULL', the_row.schema_name);
        RETURN QUERY EXECUTE the_statement;
    END LOOP;
    RETURN;
END;
$_$ LANGUAGE plpgsql;
现在,您可以使用

SELECT * FROM list_last_logins();

感谢您的回答和专业知识,阿尔贝先生!
CREATE FUNCTION list_last_logins() RETURNS SETOF TIMESTAMP AS $$
DECLARE
    the_row RECORD;
    the_statement TEXT;
BEGIN
    FOR the_row IN SELECT t.schema_name FROM information_schema.tables t WHERE t.table_name = 'status'
    LOOP
        the_statement := FORMAT('SELECT "lastLogin" FROM %s.status WHERE "lastLogin" IS NOT NULL', the_row.schema_name);
        RETURN QUERY EXECUTE the_statement;
    END LOOP;
    RETURN;
END;
$_$ LANGUAGE plpgsql;
SELECT * FROM list_last_logins();