0

我有一个带有 DB2 数据库的 IBM Content Manager。

在 ICMADMIN 中,我有一堆表,其中一些包含一个特定的列(我们称之为 ID_CLIENT),它是一个链接到一个表(CLIENT)的 ID。

如何从包含 ID_CLIENT 列的每个表中获取每个 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
4

1 回答 1

1

通过将其作为一个两步过程来实现您的目标是可能的:

  1. 查询 SYSCAT 视图,为 CLIENT 的每个潜在子表生成单独的 SQL 语句
  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 ;

于 2014-12-19T02:26:13.937 回答