2011-08-18 81 views
1

我有一個來自我以前的問題(link)關於複雜的選擇, 查詢,我的問題是,我怎麼能寫這個查詢的結果更新查詢,將fet_id更改爲一些新的值。如何爲此SELECT查詢編寫UPDATE查詢?

請注意,此查詢將從隊列中選擇行,直到rcpts_count達到1000(用於流量控制)。有關此查詢的更多信息是,in this question

SELECT NULL AS msg_id, NULL AS total, NULL AS found 
    FROM dual 
    WHERE (
     @total :=0 
     OR 
     @found :=0 
    ) 
    UNION 
     SELECT msg_id, @total AS total, @found :=1 AS found 
     FROM messages_queue 
     WHERE (
     @total := @total + rcpts_count 
    ) 
    AND @total <1000 
    UNION 
     SELECT msg_id, rcpts_count AS total, 0 AS found 
     FROM messages_queue 
     WHERE IF(@found =0, @found :=1, 0) 
+0

想要更新上表中返回的集合中的所有記錄,將字段'fet_id'設置爲整個集合的單個值嗎? –

回答

0

如果你想更新集合中的所有記錄,你可以寫這樣的查詢:

UPDATE message_queue mq 
INNER JOIN (
    SELECT NULL AS msg_id, NULL AS total, NULL AS found 
    FROM dual 
    WHERE (
     @total :=0 
     OR 
     @found :=0 
    ) 
    UNION 
     SELECT msg_id, @total AS total, @found :=1 AS found 
     FROM messages_queue 
     WHERE (
     @total := @total + rcpts_count 
    ) 
     AND @total <1000 
    UNION 
     SELECT msg_id, rcpts_count AS total, 0 AS found 
     FROM messages_queue 
     WHERE IF(@found =0, @found :=1, 0) 
) msgs ON msgs.msg_id = mq.msg_id 
SET mq.fet_id = 12345; 

但是,根據您的活動,這是不是一種安全的方法,因爲從查詢返回的記錄可能會在兩個請求之間發生變化。

我推薦以下方法之一:

  • 處理應用側
  • 創建一個查詢結果的臨時表的更新,並與加入到臨時更新表表
  • 假設'fet_id'是該批次唯一的鍵,請先運行update語句,然後根據fet_id進行簡單的選擇。
+0

謝謝@DougKress我必須提到這個表不會有任何'UPDATE',只是'INSERT',然後'SELECT',然後'DELETE'。所以在我的情況下,你建議運行你的(不安全)查詢? –

+0

我對你的問題感到困惑 - 在你試圖更新什麼(你問'我怎樣才能寫一個更新查詢')與數據的結果。是否有另一張表您想要更新?您想在執行選擇後刪除所述記錄嗎? –

0

我看到您正在詢問MySql。這是一個MsSql解決方案,但我認爲語法非常接近(但不是100%肯定)。這個例子被簡化了,所以它可以適用於任何Stack用戶。希望你可以翻譯成你的特定數據集。

-- sample table 
create table x 
    (col1 int identity(1, 1) 
    ,col2 varchar(50)) 

-- sample data 
insert into x (col2) values 
    (null) 
    ,(null) 
    ,(null) 
    ,(null) 
    ,(null) 

-- update from select 
update x 
    set x.col2 = 'even' 
from x as [t2] 
where 
    col1 = t2.col1 
    and t2.col1 % 2 = 0 

-- show results 
select * from x 

-- clean up 
drop table x 

祝你好運。