我想列出最大的表,并检查这些表是否有一列LOGSYS。
像:
db2 "Select t.TABNAME,t.NPAGES,(select count(c.colname) from syscat.columns as c
where c.TABNAME = t.TABNAME and c.colname = 'LOGSYS') from SYSCAT.TABLES as t
WHERE t.TABSCHEMA = 'OWN' order by t.NPAGES DESC FETCH FIRST 3 ROWS ONLY"
输出应该显示其中一个最大的表是否有一个名为LOGSYS的列(所有表都应该在sql语句的输出中列出)。
答案 0 :(得分:0)
我不希望你的查询需要花很长时间。虽然你可以通过创建一个实际的连接来改进它,而不是做一个子查询(见下文),但它似乎应该能得到你所要求的。您尝试运行查询时是否收到任何错误代码?
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
答案 1 :(得分:0)
此版本的效率可能更高一些,因为每个表中只能有一个具有指定名称的列:
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
。