是否可以使用另一个文件中的详细信息总数更新一个SELECT中的记录

时间:2013-12-12 21:06:27

标签: sql-server sql-update correlated-subquery

我在发票头文件上创建了一个触发器。它会创建一个PPAY表行,但是在触发时不知道总量。填充PPAY金额所需的金额是所有相关发票明细记录的总和(在标题插入触发时未写出)。

Header记录插入触发器创建一个NULL量的PPAY记录。总量将从MRRECVD表中收集,其中PPAY和MRRECVD的CONTROL#必须匹配。

以下不起作用:

-- Add the amount to the PPAY items in one sentence
UPDATE [PositivePay].[dbo].[PPAY] 
    SET AMOUNT = (
        SELECT SUM(DETAIL_AMOUNT) 
        FROM [TMP].[dbo].[MRRECVD] d
        WHERE d.CONTROL = CONTROL
        GROUP BY d.CONTROL
        )
WHERE AMOUNT IS NULL

我收到此错误: 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我的理解是,为了解决这个问题,我应该减少我的子查询,以便它只返回一个结果,这是SUM()的全部概念。

我还应该提到PPAY和MRRECVD表之间的公共因子是CONTROL列,而PPAY表中可以有多行由CONTROL_SEQ(1,2,3等)区分。

这甚至可以吗?

2 个答案:

答案 0 :(得分:1)

包含GROUP BY d.CONTROL是不必要的,虽然我不明白为什么它会给你多个值,因为你应该只有一个类型的控制值给定你的where子句。

尝试删除GROUP BY子句以查看是否获得单个和值。

答案 1 :(得分:0)

有效!应该强调的是,由于聚合SUM()

,GROUP BY子句是必需的
UPDATE p
    SET p.AMOUNT = d.sum_amt
FROM [PositivePay].[dbo].[PPAY] p
INNER JOIN
    (
        SELECT  CONTROL, sum(d.DETAIL_AMOUNT) as sum_amt
        FROM [TMP].[dbo].[MRRECVD] d
        GROUP BY CONTROL
    ) AS d
    ON p.CONTROL = d.CONTROL
WHERE p.AMOUNT IS NULL