Sql 获取最大的表并检查这些表中是否存在列(一个查询)
我想列出最大的表,并检查这些表是否有LOGSYS列 比如:Sql 获取最大的表并检查这些表中是否存在列(一个查询),sql,db2,Sql,Db2,我想列出最大的表,并检查这些表是否有LOGSYS列 比如: 这是个好办法吗?有更好的办法吗 执行正在运行,但未结束(或将在几天后结束…:-() 输出应该显示这些最大的表中是否有一个名为LOGSYS的列(所有表都应该在sql语句的输出中列出)。我不认为查询需要花费很长时间。尽管您可能可以通过创建实际的联接而不是执行子查询来改进查询(请参见下文),它似乎应该满足您的要求。您在尝试运行查询时是否收到任何错误代码 SELECT T.TABSCHEMA ,T.TABNAME ,T
输出应该显示这些最大的表中是否有一个名为LOGSYS的列(所有表都应该在sql语句的输出中列出)。我不认为查询需要花费很长时间。尽管您可能可以通过创建实际的联接而不是执行子查询来改进查询(请参见下文),它似乎应该满足您的要求。您在尝试运行查询时是否收到任何错误代码
SELECT
T.TABSCHEMA
,T.TABNAME
,T.NPAGES
,COUNT(C.COLNAME)
FROM SYSCAT.TABLES T
JOIN SYSCAT.COLUMNS C
ON C.TABNAME = T.TABNAME
AND C.TABSCHEMA = T.TABSCHEMA
WHERE T.TABSCHEMA = 'OWN'
AND C.COLNAME = 'LOGSYS'
GROUP BY
T.TABSCHEMA
,T.TABNAME
,T.NPAGES
ORDER BY
T.NPAGES DESC
FETCH FIRST 3 ROWS ONLY
此版本可能更高效,因为每个表中只能有一列具有指定名称:
Select
t.TABNAME,
t.NPAGES,
case
when
exists (select 1
from syscat.columns as c
where c.TABNAME = t.TABNAME
and c.TABSCHEMA = t.TABSCHEMA
and c.colname = 'LOGSYS')
then 1
else 0
end
from SYSCAT.TABLES as t
WHERE
t.TABSCHEMA = 'OWN'
order by t.NPAGES DESC
FETCH FIRST 3 ROWS ONLY
请注意,TABNAME
和TABSCHEMA
都是唯一标识表所必需的
Select
t.TABNAME,
t.NPAGES,
case
when
exists (select 1
from syscat.columns as c
where c.TABNAME = t.TABNAME
and c.TABSCHEMA = t.TABSCHEMA
and c.colname = 'LOGSYS')
then 1
else 0
end
from SYSCAT.TABLES as t
WHERE
t.TABSCHEMA = 'OWN'
order by t.NPAGES DESC
FETCH FIRST 3 ROWS ONLY