使用表格本身的数据更新表格的每一行

时间:2018-10-16 13:15:28

标签: sql-server tsql sql-server-2012

我在更新工作表时遇到问题-该表中的值来自表本身。这是我的桌子:

+----------+----------+-----+---------+
| 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示例中的查询给了我错误,我什至无法运行它。怎么了?

错误:

enter image description here

查询:

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)

4 个答案:

答案 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。抱歉,我只是想验证一下这是否是故意的?

相关问题