Вы подходите с использованием коррелированного подзапроса, это довольно хороший и, возможно, самый быстрый метод.
Для производительности вам нужен индекс на table2(pid, rate)
.
Можно также рассмотреть индекс на table1(col4, coldate, pid)
и переписать условие на col4
, чтобы использовать явное равенство вместо сопоставления с шаблоном без подстановочного знака (хотя, возможно, база данных уже оптимизировала это):
SELECT
t1.*,
(SELECT sum(rate) as total FROM table2 where pid=t1.pid) as total
FROM table1 t1
WHERE
t1.coldate BETWEEN '2020-01-01' AND '2020-04-01'
AND t1.col4 = 'self'
ORDER BY t1.pid DESC;
В крайнем случае, вы можете также перечислить все столбцы из table1
в предложении SELECT
и добавить их в индекс, в надежде, что это сделает его , охватывающим - table1(col4, coldate, pid, name)
:
SELECT
t1.pid,
t1.name,
t1.coldate,
t1.col4,
(SELECT sum(rate) as total FROM table2 where pid=t1.pid) as total
FROM table1 t1
WHERE
t1.coldate BETWEEN '2020-01-01' AND '2020-04-01'
AND t1.col4 = 'self'
ORDER BY t1.pid DESC;