我从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)
答案 0 :(得分:3)
在子查询中使用GROUP BY
方法,在INNER JOIN
表中使用[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;
答案 1 :(得分:1)
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)
答案 2 :(得分:0)
如果您要查找id的计数总和不为零的记录,则至少有一个非唯一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
)