У меня недостаточно информации, но я подозреваю, что с вашим дизайном что-то не так.Вам не нужна дополнительная таблица для каждого типа.
Как бы то ни было, то, что вы хотите сделать, не может быть сделано - в чистом SQL.Это можно сделать с помощью функции plpgsql, выполняющей динамический SQL, однако:
CREATE OR REPLACE FUNCTION f_type_ct()
RETURNS TABLE (type_name text, ct bigint) AS
$BODY$
DECLARE
tbl text;
BEGIN
FOR tbl IN SELECT t.type_name FROM types t ORDER BY t.type_name
LOOP
RETURN QUERY EXECUTE
'SELECT $1, count(*) FROM ' || tbl::regclass
USING tbl;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
Вызов:
SELECT * FROM f_type_ct();
Вам нужно будет изучить большую часть главы о plpgsql вруководство , чтобы понять, что здесь происходит.
Один специальный совет: приведение к regclass
является защитой от SQLi.Вы также можете использовать более широко применяемый quote_ident()
для этого, но он не обрабатывает имена таблиц, соответствующие схеме, в то время как приведение к regclass
делает.Он также принимает только имена таблиц, которые видны вызывающему пользователю.