我正在RAD Studio 10.2 Tokyo上编写的C ++项目中使用DBF数据库。为了在此数据库上发出请求,我使用了UniDac Devart组件(与MySQL本身相比有一点限制)。我遇到的问题是,在请求中使用WHERE IN条件时,请求执行的时间过多(有时超过一小时)。
这是我的要求:
KClass<SomeClass>
帐户,文档类型,句点是字符,而数字是数字。
问题出在matchno IN的周围。我想在不使用IN的情况下优化请求。我在Internet上看到可以用INNER JOIN联结代替WHERE IN条件,但我不知道这是否是解决方案以及如何执行此操作。
可以帮我吗?
答案 0 :(得分:0)
您可以尝试以下
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
答案 1 :(得分:0)
第一个建议
您可以在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都执行查询。内部联接只是两个表之间的联接,而仅执行一次