выбрать все данные, в которых все поля соответствуют условию - PullRequest
1 голос
/ 03 августа 2020

Помогите, пожалуйста, составить запрос sql. Есть база данных (в ней больше столбцов, но я не думаю, что это важно). Как получить all seller_id, где все магазины закрыты, если хотя бы один магазин открыт или временно закрыт, то не работает. В случае данных, которые я привел ниже, должны отображаться только seller_id 1 и 4. Заранее спасибо

seller_id | shop_id  | shop_status
-------------------------------------
    1     |   10     |   close
    2     |   11     |   open
    1     |   12     |   close
    2     |   13     |   temporarily_close
    3     |   14     |   open
    3     |   15     |   close
    4     |   16     |   close

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать агрегирование и предложение having:

select seller_id
from t
group by seller_id
having min(shop_status) = max(shop_status) and min(shop_status) = 'close';

Если у вас есть отдельный список продавцов, то not exists может быть быстрее:

select s.*
from sellers s
where not exists (select 1
                  from t
                  where t.seller_id = s.seller_id and
                        t.shop_status <> 'close'
                 );

EDIT :

Если shop_status может быть NULL, и вы хотите их исключить, вы можете использовать:

select seller_id
from t
group by seller_id
having min(shop_status) = max(shop_status) and
       min(shop_status) = 'close' and
       count(*) = count(shop_status);

И:

select s.*
from sellers s
where not exists (select 1
                  from t
                  where t.seller_id = s.seller_id and
                        (t.shop_status <> 'close' or t.shop_status is null)
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...