sql oracle - "Вывести фамилию и имя читателей, держащих книги более 4-х месяцев"

Рейтинг: -1Ответов: 2Опубликовано: 23.01.2023
select p_name, s_name
from reader
join card on user_id
where return_date-issue_date>4
group by p_name, s_name

Подсказывают, что Join написан неверно. Группировка мол в таком запросе не нужна (используется в паре с агрегатными функциями) и что если нужно, то лучше использовать distinct

Ответы

▲ -1Принят
SELECT reader.p_name, reader.s_name
FROM reader
JOIN card ON reader.user_id = card.user_id
WHERE card.return_date - card.issue_date > 4
GROUP BY reader.p_name, reader.s_name;
▲ 0

Схема таблиц и примерное содержимое неизвестно. Насколько я понял, будет примерно так:

SELECT
  r.P_NAME,
  r.S_NAME
FROM
  card c
  INNER JOIN reader r ON r.User_ID = c.User_ID
WHERE
  MONTHS_BETWEEN(NVL(c.RETURN_DATE, CURRENT_DATE), c.ISSUE_DATE) < 4; 

Как отметил Akina надо использовать метод MONTH_BETWEEN(date1, date2), чтобы подсчитывать разницу именно по месяцам. Также следует заранее предположить, что читатель может вообще не вернуть книгу. Cоответственно, нужна замена NULL на текущую дату для поля RETURN_DATE.