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

How can I replace WHERE IN choices in WHERE clause to reduce execution time of the request?

我在 RAD Studio 10.2 Tokyo 上编写的 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

accountrp、doctype、period 是字符,mounteur 是数字。

问题出在 matchno IN 行附近。我想在不使用 IN 的情况下优化请求。我在 Internet 上看到 WHERE IN 条件可以用 INNER JOIN 路口替换,但我不知道这是否是解决方案以及如何执行此操作。

你能帮帮我吗?

你可以试试下面的方法

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

第一个建议 您可以更改 INNER JOIN
中的 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 执行查询.. 内部联接只是两个 table 之间的联接,并且只执行一个时间