Как получить счет со всей таблицы, содержащей определенный столбец?

У меня есть 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 ответ

Вы можете достичь своей цели, подойдя к ней в два этапа:

  1. Запросите представления SYSCAT, чтобы сгенерировать отдельный оператор SQL для каждой потенциальной дочерней таблицы CLIENT.
  2. Захват и выполнение созданного вами 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 ;

Другие вопросы по тегам