Как получить счет со всей таблицы, содержащей определенный столбец?
У меня есть IBM Content Manager с базой данных DB2.
В ICMADMIN у меня есть несколько таблиц, и некоторые из них содержат определенный столбец (назовем его ID_CLIENT), который представляет собой идентификатор, связывающий одну таблицу (CLIENT).
Как я могу получить количество строк для каждого КЛИЕНТА из каждой таблицы, содержащей столбец ID_CLIENT?
Я знаю, как получить имена каждой таблицы, содержащей ID_CLIENT, но не знаю, как динамически присоединиться к CLIENT.
select tabname from syscat.columns where colname='ID_CLIENT'
(давайте назовем этот запрос A)
Так что мой псевдопросмотр будет выглядеть так:
select count(*) from CLIENT join (A) on CLIENT.ID_CLIENT = (A).ID_CLIENT
1 ответ
Вы можете достичь своей цели, подойдя к ней в два этапа:
- Запросите представления SYSCAT, чтобы сгенерировать отдельный оператор SQL для каждой потенциальной дочерней таблицы CLIENT.
- Захват и выполнение созданного вами SQL
WITH ctbls ( tbl ) AS (
SELECT RTRIM( c.tabschema ) || '.' || c.tabname
FROM syscat.columns c
INNER JOIN syscat.tables t
ON t.tabschema = c.tabschema AND t.tabname = c.tabname
WHERE c.colname = 'CLIENT_ID'
AND c.tabname <> 'CLIENT' -- we don't want to join CLIENT to itself
AND t.type = 'T' -- if you want to work with tables only
AND c.typename = 'INTEGER' -- if you want only want CLIENT_ID columns of a certain type
)
-- Construct a left join between CLIENT and each table returned by the CTE above
SELECT 'SELECT ''' || tbl
|| ''' AS childtablename, par.client_id, COUNT(*) AS childrows '
|| 'FROM client par LEFT OUTER JOIN ' || tbl || ' chd '
|| 'ON chd.client_id = par.client_id GROUP BY par.client_id;'
FROM ctbls
;