2012-09-06 79 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)相同。 –