3

我有两个表的一个很常见的情况:每个订单的“订单”和“商品购买”:

Orders: orderId, orderDate, [...]
ItemsBought: boughtId, orderId, itemId, [...]

订单可以有一个或多个 ItemsBought。现在,我只想选择那些用户同时购买了 itemId=1 和 itemId=2 的订单。

比如说,我们在 ItemsBought 表中有这样的数据:

boughtId | orderId | itemId
---------------------------
1        | 1       | 1
2        | 1       | 2
3        | 1       | 3
4        | 2       | 1
5        | 2       | 3
6        | 2       | 4

我只需要查询返回:

orderId
-------
1

Access 2010 中的 SQL 代码是什么?

4

3 回答 3

1

尝试这样的事情:

SELECT orderId 
FROM ItemsBought
WHERE itemId IN (1,2)
GROUP BY orderId
HAVING COUNT(orderId) = 2;

仅当您不能在同一个 orderid 中包含多个项目 1 或 2 时,这才有效。

sqlfiddle demo

于 2013-11-05T19:55:00.120 回答
0

我很肯定有一种更有效的方法可以做到这一点,但这是一个简单的解决方案。基本上只需对两个单独的子查询进行内部连接,这些子查询会拉回您想要的行。

结果将是两个集合之间的交集,或者换句话说,是同时找到这两个项目的那些订单。

Select orderId
From 
(
Select orderId 
From Orders o
Inner Join ItemsBought i on o.orderID = i.orderID
Where itemId = 1) qry1
Inner Join 
(Select orderId 
From Orders o
Inner Join ItemsBought i on o.orderID = i.orderID
Where itemId = 2) qr2 on qry1.orderID = qry2.orderId
Group By orderId
于 2013-11-05T19:51:22.850 回答
0

这是集合内集合查询的示例。您可以使用聚合和having子句来做到这一点。这是 MS Access 版本:

select orderId
from ItemsBought ib
where itemId in (1, 2)
group by orderId
having sum(iif(itemId = 1, 1, 0)) > 0 and
       sum(iif(itemId = 2, 1, 0)) > 0;

having子句计算匹配“1”的项目数和匹配“2”的项目数。这两个都必须大于 0 才能满足您的条件。

于 2013-11-05T19:53:47.550 回答