我发现了一个类似的问题,但不满足我的回答:SQL: Select records where ALL joined records satisfy some condition
我有两个表orders
和shipments
orders
have_many shipments
货件的属性状态为open/closed
我想查询所有发货为closed
的订单:
假设表:
运行查询将返回order3
和order4
的记录
我目前正在使用应用程序代码对N + 1进行此操作,我想仅在SQL中实现。
答案 0 :(得分:2)
让我们查找所有状态为closed
以外的,没有任何货件(匹配该订单)的订单。
Order.where("NOT EXISTS(SELECT 1 FROM shipments WHERE shipments.order_id = orders.id AND status != 'closed')"
答案 1 :(得分:1)
汇总状态,然后可以使用ALL
运算符进行过滤,该运算符将检查所有数组元素是否都符合条件。
SELECT order_id
FROM (
SELECT order_id, array_agg(status) status
FROM shipments
GROUP BY order_id
) s
WHERE 'closed' = ALL(status)