Как взять результат из таблице только если все объекты по признаку удовлетворяют условию?

Есть таблица:

id order_id accepted success
1 131 true null
2 131 false null
3 132 false null
4 133 true true
5 134 true true
6 134 true true
7 134 true null
8 135 true false
9 135 true true
10 135 false null

Нужно вернуть сгруппированные order_id, где все записи по этому order_id удовлетворяют accpted notnull и ((accpted = true и success notnull) или accepted = false) (в контексте одного order_id). То-есть из таблицы должно вернуться - 132, 133, 135.

131 не возвращается так как у первой записи accepted = true а success isnull.

134 не возвращается так как у седьмой записи accepted = true а success isnull.

Вот так пробую:

SELECT DISTINCT t1.order_id
    FROM orders.order_flow t1
    WHERE ((SELECT COUNT(*)
                FROM orders.order_flow t2
                WHERE t1.order_id = t2.order_id
                    AND (t2.accepted = TRUE AND t2.success NOTNULL)
                   OR t2.accepted = FALSE) =
           (SELECT COUNT(*) FROM orders.order_flow t3 WHERE t3.order_id = t1.order_id));

но алгоритм не правильный, так как под-запрос захватывает записи относящиеся к другому order_id.

И так:

SELECT DISTINCT t1.order_id
    FROM orders.order_flow t1
    WHERE EXISTS(
            SELECT
                FROM orders.order_flow t2
                WHERE t1.order_id = t2.order_id
                  AND ((t2.accepted = TRUE AND t2.success NOTNULL)
                    OR t2.accepted = FALSE))

Но тогда при таких данных:

id order_id accepted success
1 200 false null
2 200 true null

Выдает 200, что не правильно, так как у второй записи accepted = true, а success isnull


Ответы (0 шт):