SQL子查询和聚合函数

时间:2014-10-24 19:59:04

标签: sql subquery aggregate-functions

我只是在学习SQL子查询,我有点困惑为什么这不起作用。我有两个表,Order和OrderDetails。它们都有OrderID,OrderDetails有OrderDetails.ProductID和OrderDetails.Quantity字段。因此,不同的订单可以具有不同的产品,并且在OrderDetails表上,如果订单具有多个不同的产品,则OrderID可以有多个行。

所以在订单表上可能就像

订单ID

10248

10249

10250

并在OrderDetails表中:

OrderID | ProductID |量

10248 | 11 | 12

10248 | 42 | 10

10248 | 72 | 5

我想要做的是打印出所有订购了1件以上产品的订单ID列表。

我认为以下内容是有道理的:

Select Orders.OrderID 
   FROM Orders 
     WHERE Orders.OrderID = (Select OrderDetails.OrderID
                                  FROM OrderDetails
                                  GROUP BY OrderDetails.OrderID
                                  HAVING (COUNT(OrderDetails.ProductID) > 1))

但这肯定不起作用。即使数据库中的OrderID基本上有多个产品,也只打印一个订单ID。我希望我问这个问题的方式并不太混乱,这是我第一次在这里发布关于SQL的文章

1 个答案:

答案 0 :(得分:2)

这就是你需要的,你的内在疑问。

Select OrderID
FROM OrderDetails
GROUP BY OrderID
HAVING COUNT(*) > 1

如果您希望这些订单的主Order表中的其他字段包含多个产品,请使用以下内容。

SELECT * 
FROM Orders
WHERE OrderId IN ( 
    SELECT OrderID
    FROM OrderDetails
    GROUP BY OrderID
    HAVING COUNT(*) > 1
    )