如何替换 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 之间的联接,并且只执行一个时间
我在 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 之间的联接,并且只执行一个时间