如何从两个表中的结果中获取id

时间:2010-02-10 21:40:28

标签: tsql sql-server-2008

考虑订单。订单将包含一个或多个订单项。每个订单项都适用于特定产品。

考虑到包含几个产品的过滤表,我如何获得至少包含第二个表中列出的所有产品的订单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

2 个答案:

答案 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运行并且他们执行相同的操作,但是使用一个不错的数据集,我认为连接会表现得更好。