考虑订单。订单将包含一个或多个订单项。每个订单项都适用于特定产品。
考虑到包含几个产品的过滤表,我如何获得至少包含第二个表中列出的所有产品的订单ID?
table Orders(
OrderId int
)
table LineItems (
OrderId int,
LineItemId int,
ProductId int
)
table Filter (
ProductId int
)
数据
Orders
OrderId
--------
1
2
3
LineItems
OrderId LineItemId ProductId
------- ---------- ---------
1 1 401
1 2 502
2 3 401
3 4 401
3 5 603
3 6 714
Filter
ProductId
---------
401
603
查询的理想结果: OrderId:3
答案 0 :(得分:1)
select orderid
from lineitems
group by orderid
having count(distinct productid)
>= (select count(distinct productid) from filter)
可能有效(不确定having
术语,因为我无法在我的主页上测试它。)
答案 1 :(得分:1)
davek很接近。首先,您必须缩小结果集范围,使其仅包含与筛选表匹配的项目,然后按计数获取结果:
select orderId
from lineitems
where ProductId
in (select productId from filter)
group by orderid
having count(distinct productid)
= (select count(distinct productid) from filter)
或使用联接而不是:
select orderId
from lineitems li
inner join filter f on li.productId = f.productid
group by orderid
having count(distinct li.productid)
= (select count(distinct productid) from filter)
我通过QA运行并且他们执行相同的操作,但是使用一个不错的数据集,我认为连接会表现得更好。