Sql 联接是否比此子查询更好
我已经创建了一个表变量,其中填充了我在存储过程中处理的一些超额支付的主键。此表中可以有0到10行 对于每一笔“超额支付”,我需要计算已经支付给这笔债务的金额。为了做到这一点,我使用我的临时表作为根,然后使用子查询连接我需要的其他表中的行,并将该子查询中的值相加,如下所示:Sql 联接是否比此子查询更好,sql,sql-server,Sql,Sql Server,我已经创建了一个表变量,其中填充了我在存储过程中处理的一些超额支付的主键。此表中可以有0到10行 对于每一笔“超额支付”,我需要计算已经支付给这笔债务的金额。为了做到这一点,我使用我的临时表作为根,然后使用子查询连接我需要的其他表中的行,并将该子查询中的值相加,如下所示: UPDATE op SET op.PaymentsTotal = breakdown.amt FROM @Overpayments op INNER JOIN ( SELECT op.OverpaymentID, SUM(
UPDATE op
SET op.PaymentsTotal = breakdown.amt
FROM @Overpayments op
INNER JOIN (
SELECT op.OverpaymentID, SUM(da.Amount) AS amt
FROM dbo.OverpaymentPlan op
INNER JOIN dbo.OverpaymentPlanSchedule ops
ON ops.OverpaymentPlanID = op.OverpaymentPlanID
INNER JOIN dbo.PaymentAllocation pa
ON pa.OverpaymentPlanScheduleID = ops.OverpaymentPlanScheduleID
INNER JOIN dbo.DailyAllocation da
ON da.PaymentAllocationID = pa.PaymentAllocationID
GROUP BY op.OverpaymentID
) breakdown
ON breakdown.OverpaymentID = op.OverpaymentID
我担心这可能效率低下。我这样说对吗,因为子查询没有WHERE子句——它将汇总我的表中所有行中的所有值(这些表有数百万条记录),然后只选择我需要的几个临时表
“JOIN”方法的唯一问题是,当我尝试添加SUM时,在更新中出现了一个错误,说我不能使用SUM
或者,SQL可以看到我对子查询所做的连接,并且只获取相关行吗
或者。。。我是否应该找到一种不使用子查询的方法来执行此操作?我想可以用join来代替?你说得对。由于
GROUPBY
语句,子查询将被完全计算。子查询与整个查询分开进行优化并不一定是正确的,但根据我的经验,对于聚合来说也是如此
解决此问题的一个简单方法是使用交叉应用:
UPDATE op2
SET op.PaymentsTotal = breakdown.amt
FROM @Overpayments op2 CROSS APPLY
(SELECT op.OverpaymentID, SUM(da.Amount) AS amt
FROM dbo.OverpaymentPlan op INNER JOIN
dbo.OverpaymentPlanSchedule ops
ON ops.OverpaymentPlanID = op.OverpaymentPlanID INNER JOIN
dbo.PaymentAllocation pa
ON pa.OverpaymentPlanScheduleID = ops.OverpaymentPlanScheduleID INNER JOIN
dbo.DailyAllocation da
ON da.PaymentAllocationID = pa.PaymentAllocationID
WHERE op2.OverpaymentID = op.OverpaymentID
GROUP BY op.OverpaymentID
) breakdown;
您也可以为此使用相关子查询。谢谢@Gordon-在子查询中向我的临时表添加联接是否也可以接受-从而限制子查询中的值?@Craig。是的,这也是一个很好的方法。