来自多个表的SUM

时间:2012-10-08 17:55:34

标签: sql-server

我有三张桌子:

  • order
  • orderline(有orderID
  • orderactions(有orderID

然后我需要SUM(of orderline.price)SUM(of orderactions.price)orderID

我用的时候:

    SELECT order.ID, SUM(orderlines.price), SUM(orderactions.price) 
    FROM order 
    LEFT JOIN orderlines ON orderlines.orderID=order.ID
    LEFT JOIN orderactions ON orderactions.orderID=order.ID
    WHERE order.ID=@orderID
    GROUP BY order.ID

我从orderactions得到了一个结果,该结果相当于此订单的SUM(orderactions.price)*quantity个订单行.ID

我找到的只有正确结果的解决方案是每个“SUM”表的子查询:

SELECT order.ID
, (SELECT SUM(orderlines.price) FROM orderlines WHERE orderlines.orderId=order.ID)
, (SELECT SUM(orderactions.price) FROM orderactions WHERE orderactions.orderId=order.ID)
FROM order
WHERE order.ID=@orderID

问题:是否有其他(更快)的解决方案,因为子查询很慢,我们尝试不使用它们?

2 个答案:

答案 0 :(得分:1)

由于你的select只运行两个非常简单的子查询,我会说你的查询非常接近最优。除非查询以某种方式相关,否则无需添加JOIN

关于子查询的缓慢部分通常是数据库可能(如果你不小心你如何编写查询)非显然执行它们不止一次。如果它们依赖于可能每行更改的外部值,即通过某种方式JOIN它们时,通常会发生这种情况。

您的子查询足够直接,并且不使用除常量之外的任何外部值,因此在您的情况下,它们每次只执行一次,并且通过添加JOIN来简化它们中的任何内容。 / p>

答案 1 :(得分:1)

取决于您的数据,这种方式可以解决方案:

    SELECT order.ID, 
    SUM(CASE WHEN orderlines.orderID IS NOT NULL THEN orderlines.price ELSE 0 END), 
    SUM(CASE WHEN orderactions.orderID IS NOT NULL THEN orderactions.price ELSE 0 END) 
FROM order 
LEFT JOIN orderlines ON orderlines.orderID=order.ID
LEFT JOIN orderactions ON orderactions.orderID=order.ID
WHERE order.ID=@orderID
GROUP BY order.ID