我使用Microsoft SQL Server,但我想这个问题将适用于所有SQL语言。
如果我有:
SELECT OrderHeaderID
,isNull(Qty,0) AS Qty
FROM OrderHeader
LEFT JOIN (
SELECT OrderHeaderID
,Sum(Qty) AS Qty
FROM OrderDetail
GROUP BY OrderHeaderID
) OrderDetail
ON OrderDetail.OrderHeaderID = OrderHeader.OrderHeaderID
WHERE Criteria = 'X'
然后,在应用条件之前,将对所有OrderDetail行执行GROUP BY吗?换句话说,我应该注意将标准应用于GROUP BY以及外部SELECT吗?
顺便说一句,如果您对此代码行有任何改进,请也发表评论。
最佳答案
关于第一个问题,在编译查询时很难告诉优化器发现了什么。我认为您的内部汇总首先执行。
关于第二个问题,这两种选择可能更容易理解
SELECT OrderHeader.OrderHeaderID
,isNull(Sum(OrderDetail.Qty),0) AS Qty
FROM OrderHeader
LEFT JOIN OrderDetail
ON OrderDetail.OrderHeaderID = OrderHeader.OrderHeaderID
WHERE OrderHeader.Criteria = 'X'
GROUP BY OrderHeader.OrderHeaderID
要么
select OrderHeaderId,
IsNull(
(Select sum(qty) from OrderDetails d
where d.OrderHeaderId = OrderHeader.OrderHeaderId)
,0) as qty
from OrderHeader
where Criteria='X'