我有两个表的相当普遍的情况:每个订单的'订单'和'ItemsBought':
Orders: orderId, orderDate, [...]
ItemsBought: boughtId, orderId, itemId, [...]
订单可以有一个或多个ItemsBought。现在,我想只选择那些用户买入的订单,其中itemId = 1 AND 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代码是什么?
答案 0 :(得分:1)
尝试这样的事情:
SELECT orderId
FROM ItemsBought
WHERE itemId IN (1,2)
GROUP BY orderId
HAVING COUNT(orderId) = 2;
只有在同一个orderid中不能有多个第1项或第2项时,这才有效。
答案 1 :(得分: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
答案 2 :(得分:0)
这是set-within-sets查询的示例。您可以使用聚合和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才能满足你的条件。