2013-07-17 228 views
0

我想爲所有whoes活動持續太久的表格更新我的表格。更新應該糾正一次,以及我需要處理新結果的後續行。所以想想像Informix:使用SELECT進行UPDATE - 語法?

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。

回答

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子句。

乾杯!

+0

我還沒有想過這種風格。 Thx,我會嘗試它(儘管我已經找到了另一種解決方案)。 – LeO

+0

這是否工作? –

+0

說實話:我沒有嘗試,但語法看起來非常非常有希望。因此我會接受答案。我沒有想過一個元組變體... – LeO

0
  1. 語法錯誤,因爲您要更新的第一列和第二列之間缺少逗號。

  2. 不要使用ROWID,它們是易失性的,默認情況下不會與IDS一起使用,除非您指定了。

  3. 你爲什麼使用子查詢?

+0

add1)嗯,你說得對,但是st的語法錯誤已經提出來了,所以把它作爲我想達到的元語言。 add2)rowid並不意味着內部密鑰,而是一個在不同表中使用的唯一密鑰。 add3)導致總和從另一個表中計算,具有多個依賴關係。但總和可能與一些獨特的關鍵相關。因此,我正在尋找更新的正確語法 – LeO