代码之家  ›  专栏  ›  技术社区  ›  Blair Anderson

PostgreSQL:查询所有连接的记录属性与where子句匹配的记录

  •  0
  • Blair Anderson  · 技术社区  · 7 年前

    我发现了一个类似的问题,但并不能满足我的回答: SQL: Select records where ALL joined records satisfy some condition

    我有两张桌子, orders shipments

    装运

    装运具有属性状态 open/closed

    我想查询订单,它所有的货物都在哪里 closed :

    • 订单1,2发货:1打开,1关闭
    • 订单3,1发货:0打开,1关闭

    order3 order4

    我目前正在使用应用程序代码对N+1执行此操作,我只想在SQL中实现。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Marcin Kołodziej    7 年前

    让我们查找不存在任何状态为 closed .

    Order.where("NOT EXISTS(SELECT 1 FROM shipments WHERE shipments.order_id = orders.id AND status != 'closed')"
    
        2
  •  1
  •   S-Man    7 年前

    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)