【问题标题】:How can I write an UPDATE query for this SELECT query?如何为此 SELECT 查询编写 UPDATE 查询?
【发布时间】:2011-10-30 04:38:30
【问题描述】:

我有一个关于复杂选择的问题 (link), 我的问题是,如何为这个查询的结果编写一个更新查询,将 fet_id 更改为某个新值。

请注意,此查询将从队列中选择行,直到 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 )

【问题讨论】:

  • 是否要更新上表返回的集合中的所有记录,将字段“fet_id”设置为整个集合的单个值?

标签: mysql sql sql-update


【解决方案1】:

如果您尝试更新集合中的所有记录,您可以编写如下查询:

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' 是该批次的唯一键,请先运行更新语句,然后根据 fet_id 进行简单的选择。

【讨论】:

  • 谢谢@DougKress 我必须提到这张桌子不会有任何UPDATE,只有INSERT 然后SELECT 然后DELETE。所以在我的情况下,你建议运行你的(不安全的)查询?
  • 我对你的问题感到困惑——你试图用数据结果更新什么(你问'我怎样才能写一个更新查询')。您还有要更新的表吗?执行选择后是否要删除所述记录?
【解决方案2】:

我看到您要求使用 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

祝你好运。

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多