select这个ID的计数总和不是0的所有行

我正在查询来自Excel的访问数据库。 我有一个类似于这个表格:

id Product Count 1 A 0 1 B 5 3 C 0 2 A 0 2 B 0 2 C 5 3 A 6 3 B 5 3 C 7 

从中我想返回所有的行(包括该产品的计数是0),其中该ID的计数总和不是0,产品是A或B.所以从上表中,我会得到:

 id Product Count 1 A 0 1 B 5 3 A 6 3 B 5 

下面的查询给出了正确的输出,但速度很慢(从一个稍微小一点的7k行数据库查询需要几乎一分钟),所以我想知道是否有一个更有效的方法来做到这一点。

 SELECT * FROM [BD$] BD WHERE (BD.Product='A' or BD.Product='B') AND BD.ID IN ( SELECT BD.ID FROM [BD$] BD WHERE (Product='A' or Product='B') GROUP BY BD.ID HAVING SUM(BD.Count)<>0) 

在子查询和INNER JOIN中使用GROUP BY方法返回到[BD$]表。

 SELECT BD2.* FROM ( SELECT BD1.ID FROM [BD$] AS BD1 WHERE BD1.Product IN ('A','B') GROUP BY BD1.ID HAVING SUM(BD1.Count) > 0 ) AS sub INNER JOIN [BD$] AS BD2 ON sub.ID = BD2.ID; 

IN()语句可以执行很多次,您可以尝试EXISTS():

 SELECT * FROM [BD$] BD WHERE BD.Product in('A','B') AND EXISTS(SELECT 1 FROM [BD$] BD2 WHERE BD.id = BD2.id AND BD2.Product in('A','B') AND BD2.Count > 0) 

如果您正在查找ID的计数总和为非零的logging,则至less有一个非唯一ID必须具有非零计数。

 SELECT * FROM [BD$] BD WHERE BD.Product IN ('A', 'B') AND BD.ID IN ( SELECT DISTINCT b.ID FROM [BD$] b WHERE b.Product IN ('A', 'B') AND b.Count<>0 )