【发布时间】:2019-03-19 11:09:07
【问题描述】:
想象一下我有一张这样的桌子:
# | A | B | MoreFieldsHere
1 1 1
2 1 3
3 1 5
4 2 6
5 2 7
6 3 9
B 以 1:n 的关系与 A 相关联。例如,可以使用连接创建表。
我想同时获得总计数和不同 A 的计数。
我知道我可以使用这样的查询:
SELECT v1.cnt AS total, v2.cnt AS num_of_A
FROM
(
SELECT COUNT(*) AS cnt
FROM SomeComplicatedQuery
WHERE 1=1
-- AND SomeComplicatedCondition
) v1,
(
SELECT COUNT(A) AS cnt
FROM SomeComplicatedQuery
WHERE 1=1
-- AND SomeComplicatedCondition
GROUP BY A
) v2
但是SomeComplicatedQuery 将是一个复杂而缓慢的查询,SomeComplicatedCondition 在这两种情况下都是相同的。我想避免不必要地调用它。除此之外,如果查询发生更改,您还需要确保在其他地方也进行更改,使其容易出错并创建(可能是不必要的)工作。
有没有办法更有效地做到这一点?
【问题讨论】:
-
“有没有办法更有效地做到这一点?” 让
WHERE更有效率?首先是删除1=1,因为这只是浪费编译器的时间。接下来是WHERE所说的份额,因此我们可以帮助使其表现更好。另外,如果 "SomeComplicatedCondition" 相同,为什么不在同一语句中使用COUNT(*)和COUNT(A)? -
嗯,那里是由 .net 代码动态构建的。可能有不同数量的条件,包括0,这就是为什么所有条件都在它们前面添加
AND。 1=1 的东西更容易处理。 Count(A) 也会计算 A 不是NULL的每一行,而不是不同的 A
标签: sql sql-server select group-by count