我有三张桌子:
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
问题:是否有其他(更快)的解决方案,因为子查询很慢,我们尝试不使用它们?
答案 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