SQL查询提供了太多结果

时间:2013-03-05 20:25:29

标签: sql postgresql

我正在尝试为此问题编写PostgreSQL查询:

2011年购买了多少产品? (2011年购买意味着订单描述在2011年'已完成')。 diagram

到目前为止,我已经得到了这个问题:

    SELECT
      COUNT(product.id)
    FROM
      product
    JOIN orderitem ON 
      productid = product.id
    JOIN "order" ON 
      "order".id = orderitem.orderid AND
      EXTRACT(year FROM orderplaced) = 2011
    JOIN orderstatus ON 
      orderstatus.orderid = "order".id
    JOIN orderstatusdescription ON 
      orderstatusdescription.id = orderstatusdescriptionid AND
      orderstatusdescription.description = 'Completed';

但是这导致了231410个产品,而数据库只包含1000个。使用DISTINCT(product.id)逻辑导致计数为1000。

我不知道我做错了什么。

4 个答案:

答案 0 :(得分:1)

来自Andres Olarte的稍微修改过的查询:

SELECT
  COUNT(orderitem.productid)
FROM
  orderitem
JOIN "order" ON 
  "order".id = orderitem.orderid
JOIN orderstatus ON 
  orderstatus.orderid = "order".id
JOIN orderstatusdescription ON 
  orderstatusdescription.id = orderstatusdescriptionid 
WHERE 
  EXTRACT(year FROM orderplaced) = 2011
AND  orderstatusdescription.description = 'Completed';

答案 1 :(得分:0)

尝试这样的事情:

SELECT
  COUNT(product.id)
FROM
  product
JOIN orderitem ON 
  productid = product.id
JOIN "order" ON 
  "order".id = orderitem.orderid
JOIN orderstatus ON 
  orderstatus.orderid = "order".id
JOIN orderstatusdescription ON 
  orderstatusdescription.id = orderstatusdescriptionid 
WHERE 
  EXTRACT(year FROM orderplaced) = 2011
AND  orderstatusdescription.description = 'Completed';

答案 2 :(得分:0)

您获得了更大的数字,因为您有多个记录与一个或多个连接条件匹配。

例如,当您将product表加入orderitem时,您可能会有多个匹配的orderitem记录。因此,您不止一次在结果集中获得product.id

尝试COUNT(distinct product.id) - 这应该会为您提供已购买的不同产品的数量。

答案 3 :(得分:0)

这将告诉您2011年购买了哪些产品(未经测试 - 不在PG的电脑上):

     select distinct OI.productid, P.description
     from orderitem OI inner join products P on OI.productid=P.id
     inner join
     (   
     select order.id as orderid from order
     inner join orderstatusdescription OSD
     on order.orderstatusdescriptionid = OSD.id and OSD.description = 'COMPLETED'
     where extract(year from order.orderplaced)=2011  
     ) as Orders2011
     on Orders2011.orderid = OI.orderid