Mysql 用于将列值设置为与下一行的列值相同的SQL

Mysql 用于将列值设置为与下一行的列值相同的SQL,mysql,sql,Mysql,Sql,我有一张这样的桌子 -------------------------- id some_column -------------------------- 1 null 2 abc 3 null 4 null 5 def 6 ghi update table as t1 set some_column = (select some_column from table as t2 where t2.id > t1.id a

我有一张这样的桌子

--------------------------
id    some_column
--------------------------
1      null
2      abc
3      null
4      null
5      def
6      ghi
update table as t1 set some_column = (select some_column from table as t2 where t2.id > t1.id and t2.some_column is not null limit 1) where some_column is null
在我的场景中,表中的一些初始行在某个_列中具有null。所有最新的行都正确设置了一些_列值

我想运行一个查询,通过从下一个NOTNULL值复制值来替换某个_列的所有空值

例如,运行查询后,表将变为

--------------------------
id    some_column
--------------------------
1      abc
2      abc
3      def
4      def
5      def
6      ghi
我在尝试这样的事情

--------------------------
id    some_column
--------------------------
1      null
2      abc
3      null
4      null
5      def
6      ghi
update table as t1 set some_column = (select some_column from table as t2 where t2.id > t1.id and t2.some_column is not null limit 1) where some_column is null
但是得到了错误

You can't specify target table 't1' for update in FROM clause

您可以使用order by和limit的相关子查询来获取空值后的第一个非空值。请参见“选择相关子查询”,下面的查询将使用下一个非空值更新列的空值

update t 
join(
select t1.*,
(select some_column 
 from t where id > t1.id 
 and some_column is not null
order by id limit 1
) newname
from t t1
  ) t2
on t.id = t2.id 
set t.some_column =t2.newname
where t.some_column is null
您可以通过连接来执行此操作:

tnew子查询将每个ID与null值匹配,下一个最高的ID与非null值匹配。然后,我将它与原始表连接两次,以将要更新的行配对 具有替换值的行中的值


您需要定义下一行的含义。SQL在表中没有内置的或默认的顺序概念。@RBARYYOUNG如果您查看他尝试的查询,他指的是具有非空值的次高id。@RBARYYOUNG我对下一行的定义是其中id>当前行,而某些_列不是null@RBarryYoung这是正确的。您需要首先提取数据,然后确定需要手动更新的内容。“确实没有自动的方法可以可靠地做到这一点。”@durbnpoison当然有,有一个连接。等待我的回答。谢谢,非常感谢你的帮助