我总结了使用临时表的客户的平均负载,并希望使用这些新值更新客户表。我可以做单个更新等但想要更新为一组,但继续得到'子查询返回超过1的值。当子查询从第二个代码块开始跟随...时,这是不允许的(#tcAvgs中的所有值都很好。
create table #tcAvgs
(
AccNo varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS,
AvgFrame float,
AvgValue float,
AvgJobs float
)
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t
UPDATE c
SET c.AvgFrames = a.AvgFrame,
c.AvgJobs = a.AvgJobs,
c.AvgValue = a.AvgValue
FROM customers c join #tcAvgs a on c.AccountNo = a.AccNo
我看了很多不同的做法,他们似乎都给出了同样的错误,我想知道我是否必须咬紧牙关并在临时表中循环进行个别更新?我缺少一些关于SQL能够进行多次更新的基本信息(尽管有很多单一更新)。
任何正确方向的推动都将受到赞赏。
答案 0 :(得分:1)
这个答案仅适用于那些发现触发器阻止@Andrew Bickerton和@marc_s(以及我自己最初的^^)提供解决方案的人
DECLARE @Counter INT
DECLARE @AccNo varchar(10)
DECLARE @AvgFrames float
DECLARE @AvgJobs float
DECLARE @AvgValue float
SET @Counter = 1
WHILE @Counter <= (SELECT COUNT(*) FROM #tcAvgs)
BEGIN
--update variables
SELECT @AccNo = t.AccNo, @AvgFrames = t.AvgFrame, @AvgJobs = t.AvgJobs, @AvgValue = t.AvgValue
FROM #tcAvgs t
WHERE t.Id = @Counter
UPDATE customers
SET AvgFrames = @AvgFrames,
AvgValues = @AvgValue,
AvgJobs = @AvgJobs
WHERE AccountNo = @AccNo
SET @Counter = @Counter + 1
END
答案 1 :(得分:0)
您收到的错误是SQL Server抱怨您的#tcAvgs表中有超过1个匹配行,因此它不知道您要将客户行设置为哪个值。
如果你跑:
create table #tcAvgs
(
AccNo varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS,
AvgFrame float,
AvgValue float,
AvgJobs float
)
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t
SELECT c.AccountNo, COUNT(a.AccountNo) as NumRows
FROM customers c join #tcAvgs a on c.AccountNo = a.AccNo
GROUP BY c.AccountNo
HAVING COUNT(a.AccountNo) > 1
您将找到导致问题的记录。我的猜测是:
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t
您可能需要它:
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, AVG(ROUND(t.TFrame/t.ccount ,2)),AVG(ROUND(t.TValue/t.ccount , 2)), AVG(ROUND( t.CCount/6 ,2))
FROM #tcTotals t
GROUP BY t.accno