использование номера строки в запросе на обновление - MySQL - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть запрос DB2 , который я хочу сделать MySQL совместимым:

UPDATE
(
 SELECT x.name, row_number() over () as rown from XYZ x where x.id = '123' and 
 x.div='abc')A
SET 
 A.name = 'name_1'
where 
A.rown<= ( select count(*) -1 from XYZ where id='123' and div='abc');

Теперь я попытался написать это I MySQL :

UPDATE 
(
  select x.name, (@row_number := @row_number +1) as rown 
  from XYZ x, (Select @row_number := 0)as t
  where x.id='123' and x.div='abc'
) A
Set
 A.name = 'name_1'
where
 A.rown<= ( select count(*) -1 from XYZ where id='123' and div='abc');

Однако, это дает мне ошибку: The target table A of the UPDATE is not updatable

Я пробовал несколько способов, но все тщетно. Куда я иду не так? Также, если запрос DB2 можно сделать в MySql любым другим способом, так как Mysql не поддерживает row_number()

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

В DB2 вы можете сделать это:

update XYZ f1
set f1.name='name_1'
where f1.id='123' and f1.div='abc' 
and rrn(f1) not in 
( 
   select max(rrn(f2)) from XYZ f2 where f2.id='123' and f2.div='abc'
)
0 голосов
/ 28 апреля 2018

Вы не можете обновить производную таблицу. Вам нужно присоединиться к реальной таблице, чтобы вы могли ее обновить.

UPDATE XYZ AS x
JOIN (
    select x.id, (@row_number := @row_number +1) as rown 
    from XYZ x, (Select @row_number := 0) as t
    where x.id='123' and x.div='abc'
) AS A ON x.id = A.id
Set X.name = 'name_1'
where A.rown <= ( select count(*) from XYZ where id='123' and div='abc');

Я не уверен, что это будет делать то же самое, что и запрос DB2. Кажется, предполагается, что в таблице есть некоторый внутренний порядок, и, возможно, DB2 предоставляет такую ​​возможность, но MySQL не дает никаких гарантий относительно порядка, когда вы не используете ORDER BY. Если вы добавите ORDER BY x.id в подзапрос, возможно, это будет делать то, что вы хотите.

...