我有以下查询:
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)
为什么第一个查询获得正确的计数而第二个查询没有?
答案 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
,它会返回所有行,而不仅仅是唯一行。