我有一个表,其中包含数据库中其他表的索引。
之前我迭代了这个索引来执行queries on the tables indexed,
,但正如您可能想象的那样,这对于大量表来说非常慢。
我想知道是否有可能从我的索引表上的查询结果形成一个表表达式,因此使用我的索引表上的查询的 FROM 将我的查询写成一条语句list of tables result
。
ETA:我正在使用 PostgreSQL v9.0。我通过一次迭代一个查询来查询具有相同查询的多个表(这很慢)。我想加快速度,如果有一种方法可以使用一个表表达式查询所有表,该表表达式是从索引表中选择的所有表的列表。
我的(简化的)表是“tabledata”,其中包含相同模式表 A、B、C、D、E、F、G 的列表以及每个表的布尔值“启用”。我想查询所有“启用”为真的字母表;最好使用一个查询,而不是一次遍历它们。基本上查询那些返回的表:
SELECT tablename FROM tabledata WHERE enabled = TRUE`
ETA2:我在查询工具中输入了以下内容:
CREATE FUNCTION f_all_tables()
RETURNS SETOF A AS
$body$
DECLARE
_tbl oid;
BEGIN
FOR _tbl IN
SELECT tablename::regclass
FROM tabledata
WHERE enabled
LOOP
RETURN QUERY EXECUTE '
SELECT * FROM ' || _tbl;
END LOOP;
END;
$body$ language plpgsql;
SELECT * FROM f_all_tables();
并得到一个错误:
ERROR: invalid input syntax for type oid: "A"
CONTEXT: PL/pgSQL function "f_all_tables" line 6 at FOR over SELECT rows
中A
的第一个表名在哪里tabledata
。
ETA3:
我已经实现了下面的第二个解决方案并且它有效。谢谢 示例代码:
CREATE TABLE tabledata2
(
tablename character(64) NOT NULL,
enabled boolean
)
WITH (
OIDS=FALSE
);
ALTER TABLE tabledata2
OWNER TO postgres;
CREATE TABLE AAAAAA
(
enabled boolean
)
WITH (
OIDS=FALSE
);
ALTER TABLE AAAAAA
OWNER TO postgres;
CREATE TABLE AAAAAB
(
enabled boolean
)
WITH (
OIDS=FALSE
);
ALTER TABLE AAAAAB
OWNER TO postgres;
INSERT INTO tabledata2 VALUES ('AAAAAA', 'true');
INSERT INTO tabledata2 VALUES ('AAAAAB', 'true');
INSERT INTO AAAAAA VALUES ('true');
INSERT INTO AAAAAB VALUES ('false');
CREATE FUNCTION f_all_tables()
RETURNS SETOF AAAAAA AS
$body$
DECLARE
_tbl regclass;
BEGIN
FOR _tbl IN
SELECT tablename::regclass
FROM tabledata2
WHERE enabled
LOOP
RETURN QUERY EXECUTE '
SELECT * FROM ' || _tbl;
END LOOP;
END;
$body$ language plpgsql;
SELECT * FROM f_all_tables();