データベースに他のテーブルのインデックスを持つテーブルがあります。
以前、このインデックスを繰り返し実行しqueries on the tables indexed,
ましたが、ご想像のとおり、これは多数のテーブルでは非常に低速です。
インデックステーブルのクエリの結果からテーブル式を作成して、インデックステーブルのクエリのを使用してFROMを使用してクエリを1つのステートメントとして記述できるかどうか疑問に思いlist of tables result
ます。
ETA:PostgreSQLv9.0を使用しています。同じクエリで複数のテーブルを一度に1つずつ繰り返すことでクエリを実行しています(これは遅いです)。インデックステーブルから選択されたすべてのテーブルのリストである1つのテーブル式を使用してすべてのテーブルをクエリする方法がある場合は、これを高速化したいと思います。
私の(簡略化された)テーブルは「tabledata」であり、同一のスキーマテーブルA、B、C、D、E、F、Gのリストと、それぞれに対してブール値の「有効」が含まれています。'enabled'がtrueであるすべての文字付きテーブルをクエリしたいと思います。一度に1つずつクエリを繰り返すのではなく、1つのクエリを使用することをお勧めします。基本的に、以下によって返されるテーブルを照会します。
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:
以下の2番目のソリューションを実装しましたが、機能します。おかげでサンプルコード:
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();