我有这个查询。应该避免嵌套选择吗?有没有更好的办法 ?
WITH cte(oi, oIdOf) AS (
SELECT ROW_NUMBER() OVER (ORDER BY resIdOf), resIdOf
FROM @res
WHERE resIdOf<>0
GROUP BY resIdOf
)
INSERT INTO @fop
SELECT x.xIdOf
,x.xIdBe
,x.xLgnBe
,(SELECT e.BE_Commercial FROM BE_ENLEVEMENT AS e WHERE e.BE_Numero_BE=x.xIdBe)
,SUM(x.xCoeff)
FROM cte AS o
CROSS APPLY dbo.ft_grapheOfOrigine(o.oIdOf) AS x
GROUP BY x.xIdOf,x.xIdBe,x.xLgnBe;
我不喜欢聚合相关的子查询。聚合条件可能很难正确,因为相关条件需要引用聚合后的值。
事实上,相关子查询可能非常有用,但逻辑通常是使用LEFT JOIN
任何方式实现的。
更重要的是,重写它们真的很简单。所以:
SELECT x.xIdOf, x.xIdBe, x.xLgnBe,
e.BE_Commercial,
SUM(x.xCoeff)
FROM cte o CROSS APPLY
dbo.ft_grapheOfOrigine(o.oIdOf) AS x LEFT JOIN
BE_ENLEVEMENT e
ON e.BE_Numero_BE = x.xIdBe
GROUP BY x.xIdOf, x.xIdBe, x.xLgnBe, e.BE_Commercial;
从性能的角度来看,这与您的查询并不完全相同,因为它JOIN
发生在聚合之前,并且有一个额外的聚合键。但是,我认为这对性能的影响非常小,因为它已经在进行聚合。
如果这是一个问题,您可以使用子查询来获得基本相同的执行计划。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句