Как заменить выбор WHERE IN в предложении WHERE, чтобы сократить время выполнения запроса?

Я использую базу данных DBF в проекте C++, написанном на RAD Studio 10.2 Tokyo. Чтобы сделать запрос к этой базе данных, я использую компонент 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 - символ, а amounteur - числовой.

Проблема в том, что вокруг линии матчно ВО. Я хотел бы оптимизировать запрос без использования IN. Я видел в Интернете, что условие WHERE IN может быть заменено соединениями INNER JOIN, но я не знаю, является ли это решением и как это сделать.

Не могли бы вы мне помочь?

2 ответа

Решение

Первое предложение, которое вы могли бы изменить предложение IN в INNER JOIN
это должно быть более эффективным для производительности

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
Другие вопросы по тегам