SQL - выберите только когда все данные сделаны - PullRequest
0 голосов
/ 17 апреля 2020

Итак, у меня есть данные в таблице «один ко многим»:

id          user_id      type      status
1           1            A         Done
2           1            B         Done
3           1            C         Done
4           1            D         Ready
5           2            A         Done
6           2            B         Ready
7           2            C         Done
8           2            D         Ready

Какой возможный способ выбрать все D при статусе Ready и все A, B, C wth тот же статус user_id равен Done

Если один из A, B, C с таким же статусом user_id не является «Готово», то он не выбран.

Я застрял на WHERE функции

SELECT * FROM table WHERE type = 'D' and status = 'Ready' and (A,B,C with the same user_id  is Done)

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вы можете использовать NOT EXISTS в коррелированном подзапросе.

SELECT *
FROM table AS t1
WHERE type = 'D'
AND status = 'Ready'
AND NOT EXISTS (
    SELECT 1
    FROM table AS t2
    WHERE type IN ('A', 'B', 'C')
    AND t1.user_id = t2.user_id
    AND status != 'Done'
)
0 голосов
/ 17 апреля 2020

Вы можете использовать оконные функции, если ваша база данных поддерживает их:

select id, user_id, type, status
from (
    select 
        t.*, 
        max(case when type <> 'D' and status <> 'Done' then 1 else 0 end) 
            over(partition by user_id) flag
    from mytable t
) t
where type = 'D' and status = 'Ready' and flag = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...