获取最大的表并检查这些表中是否存在列(一个查询)

时间:2014-03-21 09:19:53

标签: sql db2

我想列出最大的表,并检查这些表是否有一列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"
  1. 这是一个好方法吗?还有更好的方法吗?
  2. 执行正在运行而没有结束(或者它将在几天之后结束...... :-()
  3. 输出应该显示其中一个最大的表是否有一个名为LOGSYS的列(所有表都应该在sql语句的输出中列出)。

2 个答案:

答案 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

请注意,唯一标识表需要TABNAMETABSCHEMA