如何替换 WHERE 子句中的 WHERE IN 选项以减少请求的执行时间



我在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

最新更新