Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:使用另一个表的SUM查询更新列_Sql_Oracle_Select - Fatal编程技术网

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

Oracle SQL:使用另一个表的SUM查询更新列,sql,oracle,select,Sql,Oracle,Select,我有两张桌子: 表1有5列(col1、col2、col3、col4、val1),表2有表1有5列(col1、col2、col3、col4、val2)。 1.Table1.val1不包含任何值。 2.对于表1和表2,col1、col2、col3和col4都是相同的,它们是主键 我想做的是,当Table1.col1=Table2.col1和Table1.col2=Table2.col2和Table1.col3=Table2.col3和Table1.col4=Table2.col4时,用总和(Tabl

我有两张桌子: 表1有5列(col1、col2、col3、col4、val1),表2有表1有5列(col1、col2、col3、col4、val2)。 1.Table1.val1不包含任何值。 2.对于表1和表2,col1、col2、col3和col4都是相同的,它们是主键

我想做的是,当Table1.col1=Table2.col1和Table1.col2=Table2.col2和Table1.col3=Table2.col3和Table1.col4=Table2.col4时,用总和(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)
但关于这个问题:,我应该有
WHERE EXISTS
子句

请帮忙!!
谢谢。

您可以大大简化查询:

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;

您可以在存在的地方使用
。其目的是在不匹配时防止
NULL
值。然而,我认为将
where
子句拉到外部可能会解决这个问题。我注意到,
where
子句使用了与相关条件相同的值。

您可以通过以下方式执行此操作:-

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

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小提琴:-

不使用临时表:-

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:-

您可以尝试以下方法:

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

使用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;
请不要忘记向表中添加别名,并在这段代码之后进行良好的提交 这个解决方案避免了您创建临时表,而且效果非常好


向您致意。

如您所见,我有一个group by子句。由于表2中的行可能重复,我有group和sum。你不这么认为吗?@MDIT。不可以。带有相关条件的
sum()
应该可以满足您的要求。但是where子句“where col3=2014和col2=51”与此有关table2@MDIT . . . 由于相关条件,这在两个表上都是相同的。因为我仍然需要表2中的列名,但我没有在上面的表结构中显示。是的,但我不想创建临时表,然后尝试直接在更新查询中使用Select Query used temp table?我无权创建表,然后我必须找到一个解决方案,创建任何其他表格好的,我要更新答案的基础上不使用临时表。这正是我所做的!!您的子查询不相关。