使 select 查询更高效(子查询减慢 运行 速度)

Making select query more efficient (subquery slows run speed)

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

我最初尝试通过两个连接来实现我的目标,但结果是错误的。

有谁知道正确的写法吗?

SELECT 
    c.cus_Name,
    COUNT(o.orderHeader_id) AS Orders,
    (select count(ol.orderLines_id) from orderlines ol where ol.orderLines_orderId = o.orderHeader_id) 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
group by
    c.cus_name
order by 
    orderTotal desc

下面的示例数据

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

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

你能用

代替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)

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

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;

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