Postgres独特的内部联接一对多,对联接表具有n个约束

问题描述

我正在尝试找到执行Postgres查询的最有效方法

我有2张桌子

  • 订单(id,订单名称
  • 物品(id,order_id,item_name)

“订单”表中的每个订单在“项目”表中列出了1到n个项目。

我想要执行的查询返回所有包含汉堡,比萨和可乐的订单。

下面的通话是进行此类查询的最佳方式吗?

SELECT disTINCT ON (orders.id)
   orders.id
FROM orders
INNER JOIN items i1 on orders.id = i1.order_id
INNER JOIN items i2 on orders.id = i2.order_id
INNER JOIN items i3 on orders.id = i3.order_id
WHERE i1.item_name = 'Burger'
AND i2.item_name = 'Fries'
AND i3.item_name = 'Coke'

解决方法

您的方法可行,并且应该相对有效。假设没有重复的订单ID /商品名称,则可以从另一个查询中删除distinct,从而避免了不必要的工作。

您还可以使用聚合。当项目数量增加时,它涉及的附加键入较少:

select o.*
from orders o
inner join items i on i.order_id = o.id
where i.item_name in ('Burger','Fries','Coke')  -- any of the three items
group by o.order_id
having count(*) = 3                               -- all items match

同样,这假设项目中没有重复项;否则,您需要使用having count(distinct i.item_name) = 3