【问题标题】:Joining on a group by通过以下方式加入群组
【发布时间】:2012-03-30 03:45:58
【问题描述】:

假设我有三个表,customers、orders 和 orderDetails。

我正在这样做:

SELECT orders.ordersId, sum(orderDetails.total)
FROM orders
LEFT OUTER JOIN orderDetails ON orders.ordersId = orderDetails.ordersId 
GROUP BY orders.ordersId 

但是假设订单表包含customersId。如何加入客户表,以便我还可以将客户姓名添加到所选字段?

谢谢,

巴里

【问题讨论】:

  • 对表客户使用 LEFT OUTER JOIN?

标签: sql


【解决方案1】:
SELECT orders.ordersId, sum(orderDetails.total), customer.name
FROM orders
LEFT OUTER JOIN orderDetails ON orders.ordersId = orderDetails.ordersId
LEFT OUTER JOIN customer on customer.customerid = orders.customerid 
GROUP BY orders.ordersId , customer.name

试试这个或类似的东西。

【讨论】:

  • 这确实有效,并且没有任何问题,但是当从多个表返回多个附加字段时,它实际上并不能很好地扩展。为了可维护性,我更喜欢加入子查询,但目前我不能投票,因为唯一的答案是错误的;)
  • 再看一遍我也不得不同意子查询方法。这是您当前发布的查询的简单答案。 ;)
【解决方案2】:

您可以这样做,如果需要,您可以获得的不仅仅是客户名称:

SELECT o.ordersId, o.orderTotal, c.customername, c.(other customer data)
FROM 
(
    SELECT orders.ordersId
            , sum(orderDetails.total) as orderTotal
            , orders.customersid
    FROM orders
    LEFT OUTER JOIN orderDetails 
            ON orders.ordersId = orderDetails.ordersId 
    GROUP BY orders.ordersId, orders.customersid
) o
LEFT JOIN customers c
    ON o.customersid = c.customersid

【讨论】:

  • 您的内部查询不返回字段customersid,因此无法在外部查询中引用或加入它。它需要添加到内部查询的SELECTGROUP BY
  • @Dems 不错,感谢您指出这一点。此问题已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2019-04-21
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多