четверг, 12 мая 2016 г.

Пример запроса, который создает запросы по констрейнту

Задача:
Найти таблицы, в которых используется пара кодов из справочника "КЦСР", а именно: 7140450641 и 7140450642.

Решение с помощью запроса, создающего подзапросы:
1) Пишем запрос, результатом которого будет один большой запрос, состоящий из множества подзапросов объединенных оператором "union all":
«
select
'select '''||c.table_name||'.'||cc.column_name||''',count(*) CNT from '
||c.table_name
||' t where t.'||cc.column_name||' in (''7140450641'', ''7140450642'') and t.BUDGET_ID=800000001309 union all'
from user_constraints c join user_cons_columns cc on cc.constraint_name = c.constraint_name where c.r_constraint_name='UQ_KCSR' and cc.column_name <> 'BUDGET_ID'
order by c.table_name,cc.column_name;
»
/* "cc.column_name <> 'BUDGET_ID'" - это условие добавлено, т.к. констрейнт "UQ_KCSR" содержит 2 колонки, в том числе и колонку "BUDGET_ID", поэтому без этого условия все подзапросы удвоятся */

2) Пример результата:
«
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...;
»


3) Этот результат оформляем таким образом (см. первую и последнюю строки):
«
select * from (
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...
) where CNT<>0;
»
/* "CNT<>0" - это условие добавлено, т.к. без него запрос будет показывать все таблицы, в том числе и где нужных нам записей нет */

Итог:
Решение сработало успешно, в результате запрос выдал (т.е. в таблице "PURPOSEFULGRANT_EXPKBK" есть 1 запись, содержащая искомый код КЦСР):
«
PURPOSEFULGRANT_EXPKBK.KCSR_CODE' 1
»

P.S. Запрос для запросов для Firebird:

Пример №1 (простой):
select
'select '''
||trim(i.rdb$relation_name)||'.'||trim(isg.rdb$field_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' where '||trim(isg.rdb$field_name)||'=777 union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'PK_BUDGETLINE'
order by
i.rdb$relation_name
,isg.rdb$field_name;

Пример №2 (сложный):
select
'select '''
||trim(i.rdb$relation_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' as t where t.'
||trim(isg.rdb$field_name)||'=3250000000441 and t.KCSR_CODE is not null union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'UQ_KCSR'
and trim(isg.rdb$field_name) = 'BUDGET_ID'
order by
i.rdb$relation_name
,isg.rdb$field_name;

Комментариев нет:

Архив