0

我想为所有活动持续时间过长的人更新我的表格。更新应该更正一次,对于后续行,我需要处理新结果。所以想到了类似的东西

UPDATE summary_table st
SET st.screen_on=newScreenOnValue
    st.active_screen_on=st.active_screen_on-(st.screen_on-newScreenOnValue) --old-value minus thedifference
FROM (
      SUB-SELECT with rowid, newScreenOnValue ... JOIN ... WHERE....
     ) nv
WHERE (st.rowid=nv.rowid)

我知道我可以通过重新运行相同的查询直接更新第一个和第二个值。但我的问题是子选择的成本似乎很高,因此想避免双重更新。两次运行相同的查询。

以上SELECT只是写我想得到的东西的非正式方式。我知道这st不起作用,但我把它留在这里以便更好地理解。当我尝试上述语句时,我总是在FROM结束位置返回一个 SyntaxError。

4

2 回答 2

2

这可以通过以下方式实现:

UPDATE summary_table st
SET (st.screen_on, st.active_screen_on) = 
    ((SELECT newScreenOnValue, st.active_screen_on-(st.screen_on-newScreenOnValue)
    FROM ... 
    JOIN... 
    WHERE..))
[WHERE if any additional condition required];

上面的查询在informix 上运行得非常好,直到您在FROM、JOIN、WHERE 子句中出现任何错误。

干杯!

于 2013-09-13T09:32:19.047 回答
0
  1. 语法错误,因为您要更新的第一列和第二列之间缺少逗号。

  2. 永远不要使用 ROWID,它们是易变的,并且默认情况下也不与 IDS 一起使用,除非您指定。

  3. 为什么要使用子查询?

于 2013-07-18T05:02:31.013 回答