Если вы хотите сделать это с помощью SQL, вы можете сделать это с помощью хранимой процедуры. Вот хранимая процедура, которая будет делать то, о чем, как я думаю, вы просите.
Я предполагаю, что вы хотите подсчитывать только те строки в таблицах, которые фактически соответствуют указанным значениям столбцов, поэтому RELTUPLES в _v_tables для этого не годятся. В примере кода хранимой процедуры также предполагается, что каждый из столбцов имеет тип varchar(1000). Вам придется изменить код, если вы хотите, чтобы он соответствовал другим типам данных.
Перед созданием хранимой процедуры создайте справочную таблицу следующим образом:
create table reftable_sp_row_count (tablename varchar(1000), rowcount bigint) distribute on random;
Затем создайте хранимую процедуру следующим образом:
CREATE OR REPLACE PROCEDURE SP_ROW_COUNT(VARCHAR(254), VARCHAR(254), VARCHAR(254), VARCHAR(254), VARCHAR(254))
RETURNS REFTABLE(REFTABLE_SP_ROW_COUNT)
EXECUTE AS OWNER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
pTablePattern ALIAS FOR $1;
pColOneName ALIAS FOR $2;
pColOneValue ALIAS FOR $3;
pColTwoName ALIAS FOR $4;
pcolTwoValue ALIAS FOR $5;
vRecord RECORD;
BEGIN
for vRecord in
EXECUTE 'SELECT schema
|| ''.''
|| tablename tablename
FROM _v_table v
WHERE tablename LIKE ''' || upper(pTablePattern) || '''
AND EXISTS
(
SELECT attname
FROM _v_relation_column c
WHERE c.objid = v.objid
AND attname = ''' || upper(pColOneName) || '''
)
AND EXISTS
(
SELECT attname
FROM _v_relation_column c
WHERE c.objid = v.objid
AND attname = ''' || upper(pColTwoName) || '''
)'
LOOP
EXECUTE IMMEDIATE 'INSERT INTO ' || REFTABLENAME ||
' SELECT ''' || vRecord.tablename || ''' , COUNT(1) from ' || vRecord.tablename ||
' where ' || upper(pColOneName) || ' = ''' || pColOneValue || ''' and ' || upper(pColTwoName) || ' = ''' || pColTwoValue || ''' ;';
-- Note that if you change the data types for a given column to a different type then you'll want to change ''' || pColOneValue || ''' to ' || pColOneValue || ' as appropriate
END LOOP;
RETURN REFTABLE;
END;
END_PROC;
Вот пример вывода.
TESTDB.ADMIN(ADMIN)=> select * from table_1 order by colA, colB;
COLA | COLB
------+------
ABC | BLUE
ABC | BLUE
ABC | BLUE
ABC | RED
ABC | RED
(5 rows)
TESTDB.ADMIN(ADMIN)=> select * from table_2 order by colA, colB;
COLA | COLB
------+--------
ABC | BLUE
ABC | BLUE
XYZ | BLUE
XYZ | BLUE
XYZ | YELLOW
(5 rows)
TESTDB.ADMIN(ADMIN)=> call sp_row_count('TABLE_%', 'COLA', 'ABC', 'COLB','BLUE');
TABLENAME | ROWCOUNT
---------------+----------
ADMIN.TABLE_1 | 3
ADMIN.TABLE_2 | 2
(2 rows)
person
ScottMcG
schedule
29.06.2014