从DB中的表中选择计数的总和

时间:2011-07-13 18:17:16

标签: sql count union

我有以下查询:

SELECT SUM(count) 
  FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
        UNION
        SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
        UNION
        SELECT 'track' AS table_name, COUNT(*) as count FROM track)

它按预期工作并返回正确的计数。但是现在当我执行以下查询时,我得到了错误的计数:

SELECT SUM(count) 
  FROM (SELECT COUNT(*) as count FROM artist
        UNION
        SELECT COUNT(*) as count FROM persons
        UNION
        SELECT COUNT(*) as count FROM track)

为什么第一个查询获得正确的计数而第二个查询没有?

3 个答案:

答案 0 :(得分:11)

UNION消除了重复值,因此如果两个计数恰好相同,则消除一个计数,并且只计算一个计数。请尝试使用UNION ALL

SELECT sum(count) FROM
(SELECT COUNT(*) as count FROM artist
UNION ALL
SELECT COUNT(*) as count FROM persons
UNION ALL
SELECT COUNT(*) as count FROM track)

答案 1 :(得分:1)

如果您可以使用近似值,只需一次计算所有表格

SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
   (index_id < 2) --cover both heaps and clustered indexes
   AND
   OBJECT_SCHEMA_NAME (object_id) <> 'sys' --ignore system stuff

这将在闪光灯中运行

采用您的原件,您可以一次性计算每张桌子的总数......

SELECT
    *,
    SUM(count) OVER () AS GrandTotal
FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
    UNION
    SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
    UNION
    SELECT 'track' AS table_name, COUNT(*) as count FROM track)

答案 2 :(得分:0)

怎么不准确?一种方法可能是因为,在第二个查询中,您需要UNION,并且两行或更多行包含相同的值 - 因为UNION会删除重复值。尝试使用UNION ALL,它会返回所有行,而不仅仅是唯一行。