我有两个表:
具有5列的表1(col1,col2,col3,col4,val1)和具有2列的表1的Table2(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时,用sum(Table2.val2)更新Table1.val1。 = Table2.col4。
我做了类似的事情:
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子句。
任何帮助,请!
谢谢。
您可以按照以下方式进行:
使用临时表:-
首先创建温度表:
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;
然后使用Temp表更新Main Table1:
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小提琴:-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小提琴:-http://sqlfiddle.com/#!4/c9286/2
是的,但我不想创建临时表
然后尝试在Update Query中直接使用Select Query used temp表。
我没有创建表的权利,那么我必须找到创建任何其他表的解决方案
好的,我将不使用临时表来更新答案。
这正是我所做的!!
您可以尝试以下方法:
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
您可以大大简化查询:
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子句。 由于表2中的行可能重复,所以我有组和总和。 你不这样认为吗?
@MDIT。 。 。 不可以。具有关联条件的sum()应该可以执行您想要的操作。
但是where子句" Where col3 = 2014 And col2 = 51"涉及table2
@MDIT。 。 。 由于存在相关条件,因此在任何一张表上都相同。
因为我仍然需要表2中没有在上面的表结构中显示的列名
@MDIT。 。 。 我不知道您的意思,但是您可以将where条件放回子查询中。