【问题标题】:Count rows in more than one table with tSQL使用 tSQL 计算多个表中的行数
【发布时间】:2012-09-06 10:27:47
【问题描述】:

我需要在 SQL Server 2008 中计算多个表中的行数。我这样做:

select count(*) from (select * from tbl1 union all select * from tbl2)

但它给了我一个错误,即 ) 附近的语法不正确。为什么?

附言。实际表数可以多于2个。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql count


    【解决方案1】:

    如果您的表格中有不同数量的列,请尝试这种方式

     SELECT count(*) 
     FROM (
          SELECT NULL as columnName 
          FROM tbl1 
              UNION ALL
          SELECT NULL 
          FROM tbl2
         ) T
    

    【讨论】:

    • 好点。谢谢。你能解释一下,“NULL a”代表什么?
    • 如果您只需要行数,那么从表中选择什么并不重要,这就是为什么它可以只是一个“NULL”值并且 a 是该列的别名。为了更清楚,我写了'NULL as a'
    • 哦,所以从技术上讲,我可以删除“as a”,然后“从 tbl1 中选择 NULL”,对吗?
    • 对,你会得到所有没有值的行,但它足以计数。
    【解决方案2】:

    试试这个:

    您必须为派生表命名

    select count(*) from 
    (select * from tbl1 union all select * from tbl2)a
    

    【讨论】:

      【解决方案3】:

      我认为您必须在 FROM 子句中为 SELECT 起别名:

      select count(*) 
      from 
      (
         select * from tbl1 
         union all 
         select * from tbl2
      ) AS SUB
      

      您还需要确保* 两个表tbl1tbl2 返回完全相同的列数,并且它们的类型必须匹配。

      【讨论】:

        【解决方案4】:

        我不喜欢在计数之前先进行并集。它为 SQL 优化器提供了选择做更多工作的机会。

        AlexK 的(已删除)解决方案很好。你也可以这样做:

        select (select count(*) from tbl1) + (select count(*) from tbl2) as cnt
        

        【讨论】:

        • 哈,没想到这么简单。只是出于好奇,您在第二个 SELECT 之后加上“as cnt”,这是故意的吗?或者,我需要那里的括号吗?
        • 另外,既然你提到了效率,两个问题。 1. 按照 hgulyan 的建议,将“count(*)”替换为“NULL as columnName”是否有帮助。 2、还有,有没有可以用于tSQL效率/速度优化的资源/文档?
        • 如果你想有效地做到这一点,那就不要扫描表了。 . . . stackoverflow.com/questions/5199412/number-of-rows-sql-server。我的理解是SQL Server会对count(*)使用索引(如果有的话),所以执行性能应该和count(1)一样。
        猜你喜欢
        • 2015-10-09
        • 2018-12-08
        • 2011-01-20
        • 2020-05-15
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多