Вложенный SELECT, или я слишком усложняю? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующие таблицы:

table1

id
name
number
status

table2

id
table1_id
transaction_no
transaction_date

Я хочувернуть список table1.name, table1.num, table2.transaction_no, где table1.status = "Active" и самое последнее table2.transaction_date старше 4 месяцев.

Я продолжаю пробовать что-то подобное, носинтаксис в разных местах терпит неудачу.

SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
INNER JOIN table2 AS tab2 ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active"
AND 
(SELECT MAX(tab2.transaction_date) FROM tab2 
 GROUP BY tab1.name) <= (date 4 months ago)

Я знаю, что это неправильно, но мой мозг пытается обойти эту идею, или я усложняю ее.Будем весьма благодарны за любые предложения или рекомендации.

1 Ответ

0 голосов
/ 07 сентября 2018

Это 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...