Как мога да напиша заявка UPDATE за тази заявка SELECT?

Имам запитване от предишния ми въпрос (връзка) за сложен избор и въпросът ми е как мога да напиша заявка за актуализиране за резултат от тази заявка, за да променя 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 )

person Aram Alipoor    schedule 18.08.2011    source източник
comment
Искате ли да актуализирате всички записи в рамките на набора, върнат с горната таблица, като зададете полето „fet_id“ на една стойност за целия набор?   -  person Doug Kress    schedule 19.08.2011


Отговори (2)


Ако се опитвате да актуализирате всички записи в набора, можете да напишете заявка като тази:

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.
person Doug Kress    schedule 18.08.2011
comment
Благодаря ти, @DougKress, трябва да спомена, че тази таблица няма да има никакви UPDATE, само INSERT, след това SELECT и след това DELETE. Така че в моята ситуация предлагате да изпълните вашата (опасна) заявка? - person Aram Alipoor; 19.08.2011
comment
Объркан съм относно въпроса ви - в това, което се опитвате да актуализирате (попитахте „как мога да напиша заявка за актуализиране“) с резултата от данните. Има ли друга таблица, която искате да актуализирате? Искате ли да изтриете споменатите записи след извършване на избора? - person Doug Kress; 19.08.2011

Виждам, че питате за 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

Късмет.

person Jerry Nixon    schedule 18.08.2011