使选择查询更有效(子查询减慢运行速度)

时间:2017-11-11 20:21:04

标签: sql subquery query-performance

自从我将子查询添加到其中后,以下查询似乎永远都要运行。

我最初尝试通过两次加入来实现我的目标,但结果是错误的。

有没有人知道写这个的正确方法?

if (movies[i].hasWatched) {
  // ...
} else {
  // ...
}

以下示例数据

Example Data of order header and order totals

2 个答案:

答案 0 :(得分:1)

奇怪的是,子选择不可能,因为计数只与分组间接相关。您想要计算与一个客户相关的所有订单的所有订单行吗?通常这应该使用第二个连接来完成,但是orderheader将在order_lines存在的情况下重复。这会在其他聚合中产生错误的结果。

通常这应该有帮助,将子选择放入连接表:

可以用

替换orderheader o吗?

(select o.*, (select count(ol.orderLines_id) from orderlines ol where ol.orderLines_orderId = o.orderHeader_id) as linesOrder from orderheader o) as o

并用

替换子选择

sum(o.linesOrder)

答案 1 :(得分:1)

对于您想要的数据,我认为这是要走的路:

SELECT c.cus_Name,
       COUNT(o.orderHeader_id) AS Orders,
       SUM(ol.cnt) as linesOrderd,
       MAX(o.orderHeader_dateCreated) AS lastOrdered,
       SUM(o.orderHeader_totalSell) AS orderTotal,
       SUM(o.orderHeader_currentSell) AS sellTotal
FROM cus c JOIN
     orderheader o
     ON o.orderHeader_customer = c.cus_id LEFT JOIN
     (SELECT ol.orderLines_orderId, count(*) as cnt
      FROM orderlines ol
      GROUP BY ol.orderLines_orderId
     ) ol
     ON ol.orderLines_orderId = o.orderHeader_id)
GROUP BY c.cus_name
ORDER BY orderTotal DESC;

我不确定它是否会更快,但它至少会产生一个明智的结果 - 客户的订单行总数而不是任意订单的订单行数。