PostgreSQL: записи запросов, где ВСЕ объединенные атрибуты записей совпадают с предложением where - PullRequest
0 голосов
/ 28 сентября 2018

Я нашел похожий вопрос, но он не удовлетворил мой ответ: SQL: выберите записи, в которых ВСЕ соединенные записи удовлетворяют некоторому условию

У меня есть две таблицы: orders и shipments

orders have_many shipments

отправления имеют статус атрибута open/closed

Я бы хотел запросить заказы, где все его отправления closed:

Предполагаемая таблица:

  • order1, 2 партии: 1открытый, 1 закрытый
  • order2, 3 партии: 1открытый, 2 закрытых
  • order3,1 отправка: 0открыто, 1 закрыто
  • заказ4, 2 отправления: 0открыто, 2 закрыто

Выполнение запроса возвращает записи для order3 и order4

Яв настоящее время это делается с помощью N + 1 с использованием кода приложения, я хотел бы просто реализовать в SQL.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

demo: db <> fiddle

Агрегируйте статус, а затем вы можете фильтровать с помощью оператора ALL, который проверяет, все ли элементы массива соответствуют условию.

SELECT order_id
FROM (
    SELECT order_id, array_agg(status) status
    FROM shipments
    GROUP BY order_id
) s
WHERE 'closed' = ALL(status)
0 голосов
/ 28 сентября 2018

Давайте посмотрим на все заказы, для которых не существует ни одной отправки (соответствующей этому заказу) со статусом, отличным от closed.

Order.where("NOT EXISTS(SELECT 1 FROM shipments WHERE shipments.order_id = orders.id AND status != 'closed')"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...