【问题标题】:Select orderId if it has both items bought如果同时购买了两件商品,请选择 orderId
【发布时间】:2013-11-05 19:28:25
【问题描述】:

我有两个表的一个很常见的情况:“Orders”放置和每个订单的“ItemsBought”:

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 代码是什么?

【问题讨论】:

  • 您必须更具体地了解您的要求。在什么条件下你想要它,你想要在输出查询中做什么?只是 orderId = 1?
  • 我需要查询以返回 orderId 列表。我打算在子查询中使用它。
  • SELECT orderId FROM ItemsBought ?
  • 这只是一次性的,还是需要足够通用才能适用于任何输入?
  • 我打算对其进行参数化并将其包含在复杂查询的 WHERE 子句中作为子查询。我只是不知道如何在同一个字段上设置 whereclause 两次(三次等)。

标签: sql ms-access ms-access-2010


【解决方案1】:

试试这样的:

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

只有在同一个 orderid 中不能有多个项目 1 或 2 时,这才有效。

sqlfiddle demo

【讨论】:

  • 是的,这就是我需要的代码。简单而优雅。非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这是集合中集合查询的示例。您可以使用聚合和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 才能满足您的条件。

    【讨论】:

    • HAVING Min(itemId = 1) + Min(itemId = 2) = -2 会起作用吗? (不过我知道这会有点神奇)
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2011-06-08
    • 2011-01-18
    • 1970-01-01
    • 2019-08-16
    • 2023-03-25
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多