2012-09-06 45 views
2

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

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

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

PS。表的实际数量可能超过2

回答

3

如果你对你的表列数不同的尝试这种方式

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

好点。谢谢。你能解释一下,“NULL a”代表什么? – c00000fd

+0

如果您只需要对行进行计数,那么从表中选择什么并不重要,这就是为什么它可以只是“NULL”值,并且是该列的别名。为了使它更清晰,我写了'NULL'作为' – hgulyan

+0

哦,所以我可以在技术上删除“作为”,只是“从tbl1选择NULL”,对吧? – c00000fd

3

试试这个:

你必须提供一个名称派生表

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

我认为你必须别名SELECTFROM条款:

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

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

+0

哈,愚蠢的我。谢谢! – c00000fd

0

我不喜欢做的计数之前做工会。它使SQL优化器有机会选择做更多的工作。

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

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

哈,我没有想到这个简单的问题。仅仅因为好奇心,你在第二次SELECT之后放了“as cnt”,是不是意图?或者,我需要那里的父母吗? – c00000fd

+0

也因为你提出了效率,两个问题。 1.是否有助于用hgulyan建议的“NULL as columnName”替换“count(*)”。 2.是否有可用于tSQL效率/速度优化的资源/文档? – c00000fd

+0

如果你想有效地做到这一点,那么不要扫描表。 。 。 。 http://stackoverflow.com/questions/5199412/number-of-rows-sql-server。我的理解是,SQL Server将使用count(*)的索引(如果可用),所以执行性能应该与count(1)相同。 –