Oracle SQL:使用另一张表的SUM查询更新列

3
我有两个表: Table1有5列(col1,col2,col3,col4,val1),Table2也有5列(col1,col2,col3,col4,val2)。 1. Table1.val1中不包含任何值。 2. 对于Table1和Table2,col1,col2,col3和col4是相同的,并且它们是主键。
我想做的是,当Table1.col1 = Table2.col1且Table1.col2 = Table2.col2且Table1.col3 = Table2.col3且Table1.col4 = Table2.col4时,用sum(Table2.val2)更新Table1.val1。
我已经做了类似以下的事情:
UPDATE Table1
SET val1 = (

select t_sommevbrute.sumvalbrute from (
Select  col1,col2,col3,col4,SUM(val2) sumvalbrute
From Table2
Where col3 = 2014 And col2=51 
GROUP BY col1, col2, col3, col4) t_sommevbrute

WHERE Table1.col1 = t_sommevbrute.col1
and Table1.col2 = t_sommevbrute.col2
and Table1.col3 = t_sommevbrute.col3
and Table1.col4 = t_sommevbrute.col4)

但是与这个问题相关的:Oracle SQL:使用另一个表中的数据更新表,我应该有WHERE EXISTS子句。

请帮忙! 谢谢。


你的子查询没有相关联。 - shawnt00
4个回答

1
您可以按以下方式进行操作:

使用临时表: 首先创建临时表:

Create table temp1 as
Select  col1,col2,col3,col4,SUM(val2) as sumvalbrute
     From table2
     Where col3 = 3 And col2=2 
     GROUP BY col1, col2, col3, col4;

然后使用临时表更新主表1:

UPDATE table1 SET table1.val1 = (SELECT temp1.sumvalbrute
                                  FROM temp1 
                                  WHERE Table1.col1 = temp1.Col1
                                  AND Table1.col2 = temp1.Col2
                                  AND Table1.col3 = temp1.Col3
                                  AND Table1.col4 = temp1.Col4);

SQL Fiddle :- http://sqlfiddle.com/#!4/4864d/5

无需使用临时表:

UPDATE table1 SET table1.val1 = (SELECT temp1.sumvalbrute
                                 FROM 
                                 (Select  col1,col2,col3,col4,SUM(val2) as sumvalbrute
                                  From table2
                                  Where col3 = 3 And col2=2 
                                  GROUP BY col1, col2, col3, col4) temp1 
                                  WHERE Table1.col1 = temp1.Col1
                                  AND Table1.col2 = temp1.Col2
                                  AND Table1.col3 = temp1.Col3
                                  AND Table1.col4 = temp1.Col4);

SQL Fiddle:- http://sqlfiddle.com/#!4/c9286/2

SQL Fiddle是一个在线SQL数据库环境,允许用户编写SQL查询,创建表格和数据,并与其他人分享它们的查询和数据。你可以在这里测试和调试你的SQL代码,它还提供了多种不同类型的数据库系统供你选择。使用SQL Fiddle可以简化数据库开发和测试过程,因为它不需要安装任何数据库软件。


是的,但我不想创建临时表。 - MDIT
那么,直接在更新查询中使用临时表所使用的选择查询,试试看呢? - HaveNoDisplayName
我没有创建表的权限,那么我必须找到一个通过创建其他表来解决问题的解决方案。 - MDIT
好的,我将根据不使用临时表的方法更新答案。 - HaveNoDisplayName
这正是我所做的!! - MDIT

0

您可以大大简化您的查询:

UPDATE Table1
    SET val1 = (select SUM(val2)
                from Table2 t
                where Table1.col1 = t.col1 and
                      Table1.col2 = t.col2 and
                      Table1.col3 = t.col3 and
                      Table1.col4 = t.col4
               )
    Where col3 = 2014 And col2 = 51;

你可以使用where exists。目的是在没有匹配时防止NULL值。然而,我认为将where子句移到外面可能会解决这个问题。我注意到where子句使用了与相关条件相同的值。

正如您所看到的,我有一个group by子句。由于Table2中的行可能重复,因此我进行了分组和求和。您觉得呢? - MDIT
@MDIT . . . 不需要。带有相关条件的 sum() 应该可以满足您的需求。 - Gordon Linoff
但是where子句“Where col3 = 2014 And col2 = 51”涉及table2表。 - MDIT
@MDIT...由于相关条件的存在,这在任何一张表上都是相同的。 - Gordon Linoff
因为我仍需要从Table2中获取一个列名,而我在上面的表结构中没有显示它。 - MDIT
@MDIT……我不知道你的意思,但是你可以把where条件放回子查询中。 - Gordon Linoff

0
你可以尝试这个:
UPDATE t1 SET t1.val1 = SUM(t2.val2)
FROM table1
INNER JOIN table2 t2 ON t2.col1 = t1.col1 
and t2.col2 = t1.col2 
and t2.col3 = t1.col3 
and t2.col4 = t2.col4

0

可以使用 MERGE 语句来实现这种更新方式:

Merge into Table1 using ( select SUM(val2) as val2, t.col1, t.col2, t.col3, t.col4
                            from Table2 t
                           group by t.col1, t.col2, t.col3, t.col4
                         ) t -- This is the alias for table 2
   on (    Table1.col1 = t.col1 
       and Table1.col2 = t.col2 
       and Table1.col3 = t.col3 
       and Table1.col4 = t.col4
      )
when matched then 
  UPDATE Table1.val1 = t.val2 --HERE IS YOUR **UPDATE**
where Table1.col3 = 2004
  and Table1.col2 = 51
 ;

commit;

请不要忘记给表添加别名,以及在此代码后进行良好的COMMIT操作。这种解决方案避免了创建临时表,并且运行得很好。
此致敬礼。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接