来自多个表的SQL更新

时间:2011-09-13 10:17:31

标签: sql postgresql sql-update

我有一个看似基本的SQL更新要在postgreSQL表上执行,该表从另一个表中取值,表结构如下......

sessions_table

session_id(PK)
速度
时间

lengths_table

length_id
SESSION_ID
length_dist

我想更新velocity字段,其中length_dist值的总和为session_table.session_id = lengths_table.session_id

我正在尝试以下语句但在运行时获取ERROR: null value in column "velocity" violates not-null constraint(当我指定单行时它可以正常工作)

UPDATE sessions_table 
SET velocity = ROUND((SELECT SUM(lengths_table.length_dist) 
                      FROM lengths_table
                      WHERE lengths_table.session_id = sessions_table.session_id)/time,2)

有人可以建议我哪里出错吗?

由于

大卫

1 个答案:

答案 0 :(得分:1)

或者:

您的语法错误(没有length_table)。应该是:

UPDATE sessions_table 
SET velocity = ROUND((SELECT SUM(lengths.length_dist) 
                      FROM lengths_table 
                      WHERE lengths.session_id = sessions_table.session_id)/time,2)

或者,在某些情况下,sessions_table记录在lengths_table中没有macthing记录。因此,在这种情况下,您需要将velocity设置为零,以满足您的非空约束:

UPDATE sessions_table 
SET velocity = coalesce(ROUND((SELECT SUM(lengths_table.length_dist) 
                               FROM lengths 
                               WHERE lengths_table.session_id = sessions_table.session_id)/time,2),0)

或者,在length_table中有一些匹配的记录,在length_dist中有空值,所以你需要用零替换那些总和才能工作的记录:

UPDATE sessions_table 
SET velocity = ROUND((SELECT SUM(coalesce(lengths_table.length_dist,0)) 
                      FROM lengths_table 
                      WHERE lengths_table.session_id = sessions_table.session_id)/time,2)