我在RAD Studio 10.2东京编写的C++项目中使用DBF数据库。为了在这个数据库上发出请求,我正在使用UniDac Devart组件(与MySQL本身相比,这有点有限)。我遇到的问题是,当在请求中使用 WHERE IN 条件时,请求执行的时间太多(有时超过一个小时)。
这是我的要求:
SELECT accountrp, SUM(amounteur) AS montant FROM %s
WHERE doctype='1' AND period<>'00' AND
matchno IN(SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0)
GROUP BY accountrp
帐户RP,文档类型,句点是字符,金额是数字。
问题出在线路匹配没有 IN。我想在不使用 IN 的情况下优化请求。我在互联网上看到 WHERE IN 条件可以用内部连接连接点替换,但我不知道这是否是解决方案以及如何做到这一点。
你能帮我吗?
第一个建议您可以在内部连接
中更改 IN 子句这应该对性能更有效
SELECT accountrp,
SUM(amounteur) AS montant
FROM %s as s
INNER JOIN (
SELECT matchno
FROM %s
GROUP BY matchno
HAVING SUM(amounteur)<>0
) t on t.matchno = s.matchno
WHERE doctype='1' AND period<>'00' AND
GROUP BY accountrp
这是因为 In 子句等效于一组 OR 条件,并且每次对每个 OR 执行查询。
你可以试试下面
SELECT s.accountrp, SUM(s.amounteur) AS montant FROM %s s
join
(SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0) t
on s.matchno =t.matchno
WHERE s.doctype='1' AND s.period<>'00'
GROUP BY s.accountrp