Сделайте подсчет строк во всех таблицах в БД, где столбец A = 1 и столбец B = DEV

Мне нужно подсчитать количество строк в системе Netezza, но только там, где 2 столбца имеют определенные значения.

У меня есть

SELECT TABLENAME, RELTUPLES 
FROM _V_TABLE 
WHERE objtype = 'TABLE' and tablename like 'MY%STUFF' 

Это покажет мне все имена таблиц и их количество строк.

Но мне нужно добавить в него предложение where. столбец A = 1 и столбец B = ABC,

в каждой таблице есть эти 2 имени столбца.

Спасибо

Крейг


person user3783481    schedule 27.06.2014    source источник


Ответы (1)


Если вы хотите сделать это с помощью 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