Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取最大的表并检查这些表中是否存在列(一个查询)_Sql_Db2 - Fatal编程技术网

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

Sql 获取最大的表并检查这些表中是否存在列(一个查询),sql,db2,Sql,Db2,我想列出最大的表,并检查这些表是否有LOGSYS列 比如: 这是个好办法吗?有更好的办法吗 执行正在运行,但未结束(或将在几天后结束…:-() 输出应该显示这些最大的表中是否有一个名为LOGSYS的列(所有表都应该在sql语句的输出中列出)。我不认为查询需要花费很长时间。尽管您可能可以通过创建实际的联接而不是执行子查询来改进查询(请参见下文),它似乎应该满足您的要求。您在尝试运行查询时是否收到任何错误代码 SELECT T.TABSCHEMA ,T.TABNAME ,T

我想列出最大的表,并检查这些表是否有LOGSYS列

比如:

  • 这是个好办法吗?有更好的办法吗
  • 执行正在运行,但未结束(或将在几天后结束…:-()

  • 输出应该显示这些最大的表中是否有一个名为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