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当然有,有一个连接。等待我的回答。谢谢,非常感谢你的帮助