Как взять результат из таблице только если все объекты по признаку удовлетворяют условию?
Есть таблица:
| 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