Это GROUP BY tab1.name
не имеет смысла в вашем подзапросе. tab1
не находится в контексте вашего подзапроса (как и tab2
в этом отношении). Вместо этого вы можете сделать коррелированный подзапрос:
AND (SELECT MAX(t2.transaction_date) FROM table2 t2 WHERE t2.table1_id = tab1.id) <= (date 4 months ago)
Теперь этот подзапрос может стоять сам по себе, и он правильно соотносится с основным запросом с помощью предложения WHERE.
Если вам нужна только последняя запись t2 (а это должно быть более 4 месяцев назад), тогда подзапрос в предложении FROM будет работать:
SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
INNER JOIN (
SELECT transaction_no, table1_id
FROM table2 t2
WHERE transaction_date = (SELECT max(transaction_date) FROM table2 WHERE table1_id = t2.table1_id)
) AS tab2
ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active";
Здесь мы все еще используем коррелированный подзапрос, чтобы извлечь запись из таблицы table2, которая имеет наибольшую дату транзакции для каждого table1_id. Затем мы присоединяем эту запись к table1_id обратно к table1.id.