【问题标题】:Informix: UPDATE with SELECT - syntax?Informix:使用 SELECT 更新 - 语法?
【发布时间】:2013-07-17 13:39:09
【问题描述】:

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

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。

【问题讨论】:

    标签: informix


    【解决方案1】:

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

    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 子句中出现任何错误。

    干杯!

    【讨论】:

    • 我还没有想过那种风格。谢谢,我会试试的(虽然我已经找到了另一种解决方案)。
    • 说实话:我没有尝试,但语法看起来非常非常有前途。因此,我会接受答案。我还没有想过元组变体......
    【解决方案2】:
    1. 语法错误,因为您要更新的第一列和第二列之间缺少逗号。

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

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

    【讨论】:

    • add1) 好吧,你是对的,但是语法错误已经被 st 提出了,所以把它当作我想要实现的元措辞。 add2) rowid 不是内部键,而是唯一键,用于不同的表。 add3) 导致总和是从另一个表计算的,具有多个依赖项。但总和可能与某些唯一键有关。因此,我正在寻找正确的更新语法
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2012-12-05
    • 2012-06-26
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多