有什么办法做这样的事情
声明一个变量,在一个select语句中给它赋一个值,然后在情况下使用它?
类似这样的东西
DECLARE @result BIGINT;
SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id)
CASE WHEN @result IS NULL THEN 0 ELSE @result END AS ColNAme
FROM T2 _t2
我的想法是避免重复两次选择计数查询。
CASE
WHEN (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) IS NULL THEN 0
ELSE (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) END AS ColNAme
我不想使用功能。
结果集应包含所有通过T2 Id引用了T2的T项的计数
ID | Count
2 | 0
4 | 12
答案 0 :(得分:1)
是的,您可以在脚本后面的select
中使用定义的变量。但是您仍然使用两个select
查询(请注意以下内容无效,因此请阅读整个答案):
DECLARE @result BIGINT;
SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id);
SELECT (CASE WHEN @result IS NULL THEN 0 ELSE @result END) AS ColNAme
FROM T2 _t2;
注意:
_t2
,因此第一个查询将返回错误。COALESCE(@result, 0)
。@result
永远不会是NULL
,因为COUNT()
永远不会返回NULL
值。因此,第二个查询实际上可能只是select @result
。T2
中的每一行返回相同的值很奇怪。我想您的实际查询会更有趣。因此,根据您想要的结果,我认为您只需要left join
和group by
:
select t2.id, count(t.id)
from t2 left join
t
on t2.id = t.t2id
group by t2.id;