我在发票头文件上创建了一个触发器。它会创建一个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等)区分。
这甚至可以吗?
答案 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