Как я могу написать запрос UPDATE для этого запроса SELECT? - PullRequest
1 голос
/ 19 августа 2011

У меня есть запрос из моего предыдущего вопроса ( ссылка ) о сложном выборе, и мой вопрос, как я могу написать запрос на обновление результата этого запроса, чтобы изменить fet_id на какое-то новое значение.

Обратите внимание, что этот запрос будет выбирать строки из очереди до тех пор, пока rcpts_count не достигнет 1000 (для управления трафиком). больше информации об этом запросе, в этом вопросе

   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 )

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

Если вы пытаетесь обновить все записи в наборе, вы можете написать запрос следующим образом:

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 голосов
/ 19 августа 2011

Я вижу, что вы просите MySql. Это решение MsSql, но я думаю, что синтаксис очень близок (но не уверен на 100%). Этот пример упрощен, поэтому его можно применять к любому пользователю стека. Надеюсь, вы можете перевести на ваш конкретный набор данных.

-- 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

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...