我在更新工作表时遇到问题-该表中的值来自表本身。这是我的桌子:
+----------+----------+-----+---------+
| EVEN_KEY | INVE_KEY | QUA | QUA_MAX |
+----------+----------+-----+---------+
| 1 | 2 | 1 | NULL |
| 2 | 2 | 2 | NULL |
| 3 | 2 | 3 | NULL |
| 1 | 1 | 2 | NULL |
| 4 | 2 | 3 | NULL |
+----------+----------+-----+---------+
我想做的是更新列qua_max-为每行给定的inve_key汇总列qua。因此,上表中的结果应在更新后如下所示:
+----------+----------+-----+---------+
| EVEN_KEY | INVE_KEY | QUA | QUA_MAX |
+----------+----------+-----+---------+
| 1 | 2 | 1 | 9 |
| 2 | 2 | 2 | 9 |
| 3 | 2 | 3 | 9 |
| 1 | 1 | 2 | 1 |
| 4 | 2 | 3 | 9 |
+----------+----------+-----+---------+
这是我的问题-this示例中的查询给了我错误,我什至无法运行它。怎么了?
错误:
查询:
UPDATE @TEMP_FINAL
SET QUA_MAX = (SELECT SUM(QUA)
FROM @TEMP_FINAL t2
WHERE @TEMP_FINAL.INVE_KEY = t2.INVE_KEY
GROUP BY INVE_KEY
)
示例表:
DECLARE @TEMP_FINAL TABLE
(
EVEN_KEY INT,
INVE_KEY INT,
QUA INT,
QUA_MAX INT
)
insert into @TEMP_FINAL (even_key, inve_key, qua)
values(1, 2, 1),
(2,2,2),
(3,2,3),
(1,1,2),
(4,2,3)
答案 0 :(得分:3)
您可以尝试一下。
UPDATE t1
SET t1.QUA_MAX = a.sum_qua
from @temp_final t1,
(SELECT SUM(QUA) as sum_qua,inve_key
FROM @TEMP_FINAL t2
GROUP BY INVE_KEY
) a
where t1.INVE_KEY = a.INVE_KEY
答案 1 :(得分:1)
您正在寻找窗口功能
sum(QUA) over (partition by INVE_KEY)
请注意,您@TEMP_FINAL
的样本数据具有QUA = 2
的{{1}},这与原始样本数据不同。
INVE_KEY = 1
一种更新方式是使用相关子查询
select
*,
QUA_MAX = sum(QUA) over (partition by INVE_KEY)
from @TEMP_FINAL
或CTE
update t1
set QUA_MAX = (select top 1 sum(QUA) over (partition by INVE_KEY) from @TEMP_FINAL t2 where t2.INVE_KEY = t1.INVE_KEY)
from @TEMP_FINAL t1
select * from @TEMP_FINAL
答案 2 :(得分:1)
我认为您应该在from子句中添加temp_final,因为您正在执行隐式自连接,但是您只声明了一个表作为别名t2
答案 3 :(得分:0)
这是您的完整代码:
DECLARE @TEMP_FINAL TABLE
(
EVEN_KEY INT,
INVE_KEY INT,
QUA INT,
QUA_MAX INT
)
insert into @TEMP_FINAL (even_key, inve_key, qua)
values(1, 2, 1),
(2,2,2),
(3,2,3),
(1,1,2),
(4,2,3)
UPDATE @TEMP_FINAL
SET QUA_MAX = (SELECT SUM(QUA)
FROM @TEMP_FINAL t2
WHERE @TEMP_FINAL.INVE_KEY = t2.INVE_KEY
GROUP BY INVE_KEY
)
我不知道我是否在看这个错误,但是对我来说,好像您在执行where子句,将同一件事与自身进行比较?但是,您不是在做@TEMP_FINAL.INVE_KEY = @TEMP_FINAL.INVE_KEY
,而是在做@TEMP_FINAL.INVE_KEY = t2.INVE_KEY
。抱歉,我只是想验证一下这是否是故意的?