Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接是否比此子查询更好_Sql_Sql Server - Fatal编程技术网

Sql 联接是否比此子查询更好

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(

我已经创建了一个表变量,其中填充了我在存储过程中处理的一些超额支付的主键。此表中可以有0到10行

对于每一笔“超额支付”,我需要计算已经支付给这笔债务的金额。为了做到这一点,我使用我的临时表作为根,然后使用子查询连接我需要的其他表中的行,并将该子查询中的值相加,如下所示:

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。是的,这也是一个很好的方法。