Oracle SQL:使用另一个表的SUM查询更新列
我有两张桌子: 表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 我做了这样的事情: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
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?我无权创建表,然后我必须找到一个解决方案,创建任何其他表格好的,我要更新答案的基础上不使用临时表。这正是我所做的!!您的子查询不相关。