2

我已经为使用临时表的客户汇总了负载平均值,并希望使用这些新值更新我们的客户表。我可以进行单次更新等,但想作为一组更新,但不断得到“子查询返回超过 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 进行多次更新(尽管有很多单次更新)的能力的基本知识。

任何朝着正确方向的推动将不胜感激。

4

2 回答 2

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
于 2012-11-28T10:55:57.860 回答
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
于 2012-11-28T10:30:29.287 回答