【发布时间】:2012-04-25 07:51:00
【问题描述】:
我有一个表,其中包含我数据库中其他表的索引。
之前我遍历这个索引来执行queries on the tables indexed,,但正如你想象的那样,这对于大量表来说非常慢。
我想知道是否可以从我的索引表上的查询结果形成一个表表达式,因此使用我的索引表上查询的list of tables result 将我的查询写成一个带有 FROM 的语句。
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();
【问题讨论】:
-
欢迎来到 StackOverflow。这是一个过于模糊和笼统的问题,无法回答。您绝对没有提供有关您的数据库架构是什么样的有用信息,您当前正在做什么(除了毫无意义的描述),也没有说明您实际尝试完成什么。如果我回答“是的,有可能”,你会奖励我正确的答案吗?如果我说“不,不是”怎么办? “也许”怎么说?请编辑您的问题以提供足够的详细信息,以便有人可以尝试并提供帮助;事实上,它应该作为"不是一个真正的问题"而结束。谢谢。 :)
-
请更具体一点:表结构、卷、SQL 查询。
-
"我有一个表,其中包含我数据库中其他表的索引" 您很可能 非常 在这里做错了什么。您要解决的问题是什么?也许我们可以想出一种方法来重新设计您存储信息的方式,这样就不需要这种结构(永远不需要)
-
您不应该将数据类型
character(64)用于表名。那是一种空白填充类型,现在基本上没用,可能会导致错误。请改用text。 More about character types in the fine manual.
标签: postgresql select dynamic-sql