mysql - 在更新查询中使用行号 - MySQL

标签 mysql db2 sql-update row-number

我有这个 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');

现在,我尝试在 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');

但是,它给了我错误:UPDATE 的目标表 A 不可更新

我尝试了多种方法,但都没有成功。我哪里出错了? 另外,如果可以通过任何其他方式将 DB2 查询放入 MySql 中,因为 Mysql 不支持 row_number()

最佳答案

您无法更新派生表。您需要加入真实的表才能更新它。

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 提供了这样的东西,但是当您不使用 ORDER BY 时,MySQL 不会对排序做出任何保证。如果您在子查询中添加 ORDER BY x.id ,也许这会达到您想要的效果。

关于mysql - 在更新查询中使用行号 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50074477/

相关文章:

mysql - SQl 选择出现在一组或多组中的数据

php - 日期为 'categories' 的 SQL JOIN

php - 使用 Codeigniter,如何向其他开发人员 stash Paypal 凭据?

mysql - 调用MySql存储过程

Java - DB2 性能改进

java - Lob 已关闭。错误代码=-4470,SQLSTATE=null

database - 添加新数据时发送通知的 Bash 脚本

Android SQLite : How to update one column of all records with different values

Mysql - If 语句,执行更新

php - 这些值未发布到数据库