使 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;
我不确定它是否会快得多,但它至少会产生一个合理的结果 -- 客户的订单行总数,而不是任意订单的订单行数。
自从我将子查询添加到其中后,下面的查询似乎永远 运行。
我最初尝试通过两个连接来实现我的目标,但结果是错误的。
有谁知道正确的写法吗?
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;
我不确定它是否会快得多,但它至少会产生一个合理的结果 -- 客户的订单行总数,而不是任意订单的订单行数。