TableA包含来自id的53,56,68,70的数据。
我的查询:
select id, count(id) as total from TableA where id in (10,22,43,55,66) group by id
输出:
id total
55 2
66 5
期望的输出:
id total
10 0
22 0
43 0
55 2
66 5
有没有办法可以重写这个查询,并且对于IN语句中不在表中的值,isnull为0?例如,10,22和43不在tableA中但在IN语句中,所以我希望这些值的总和为0
更新:我忘了提到IN语句中的值被传递给客户端应用程序中的数组中的查询。所以价值观总是不同的,所以我不能硬编码任何东西
答案 0 :(得分:2)
您无法使用in
执行此操作。您可以使用left join
:
select t.id, count(a.id)
from (select 10 as id union all select 22 union all select 43 union all
select 55 union all select 66
) t left join
tableA a
on a.id = t.id
group by t.id;
答案 1 :(得分:1)
创建表变量然后使用
DECLARE @Ids TABLE (id int, PRIMARY KEY(id))
INSERT @Ids(id) VALUES (10),(22),(43),(55),(66)
SELECT i.id, ISNULL(COUNT(id),0)
FROM @ids i
LEFT JOIN TableA ta ON ta.id = i.id
GROUP BY i.id
答案 2 :(得分:0)
如果您的ID在一个合理的范围内,那么您可以创建一个递归调用来构建一个包含所有可能id值的表,而IN子句会将其过滤为只需要的值。然后将该结果集与原始表连接以获得计数:
WITH AllNumbers AS (
SELECT 0 AS x
UNION ALL
SELECT x+1 FROM AllNumbers WHERE x < 100
)
SELECT an.x, COUNT(id)
FROM
TableA ta
RIGHT JOIN AllNumbers an ON ta.id = an.x
WHERE an.x IN (10,22,43,55,66)
GROUP BY an.x
OPTION (maxrecursion 100)
你可以调整&#39; 100&#39;将值设置为更高的数字,但它会在SQL中创建一个在某个时刻达到限制的调用堆栈。
或者,如果您有一个包含所有可能ID的现有表格,则加入到该表格而不是“AllNumbers&#39;并消除递归。
否则,可能会有一些正则表达式选项将集合转换为行,然后使用上面的相同连接语句。