Как написать запрос для исключения групп записей, если хотя бы одна запись в группе удовлетворяет определенному условию? - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно написать запрос, который выбирает записи из таблицы только в том случае, если в группе записей нет записи с указанным свойством c.

Чтобы поместить это в контекст, таблица предлагает (как в сфере недвижимости). Может быть несколько предложений с одним и тем же идентификатором. Идентификатор - это то, что определяет группировку. Другое поле - статус, которое может быть «ожидающим», «встреченным», «принятым», «отклоненным», «просроченным», «черновиком». Другое поле - это идентификатор пользователя. Допустим, покупатель сделал предложение. В базе данных будет создано новое предложение со статусом «на рассмотрении» и идентификатором покупателя. Тогда продавец может принять решение о встречной оферте. Это приведет к вставке другой записи с тем же идентификатором предложения, но со статусом «встречено» и идентификатором пользователя продавца. Это будет go до тех пор, пока предложение не будет либо «принято», либо «отклонено», либо «не истекло». 1005 *

Лучшее, что я могу придумать, это:

select distinct offer_id 
from offers
where 
    listing_id = ${listingId} 
    and offer_id not in (
        select offer_id 
        from offers 
        where status = 'Rejected' or status = 'Expired' or status = 'Draft'
    )

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

Спасибо

1 Ответ

1 голос
/ 27 мая 2020

Если я правильно следил за вами, вы можете агрегировать по offer_id и использовать предложение having, чтобы отфильтровать предложения, любые status которых отклонены, просрочены или черновики:

select offer_id
from offers
where listing_id = ? 
group by offer_id
having not bool_or(status in ('Rejected', 'Expired', 'Draft'))
...