簡體   English   中英

用於設置列值的SQL與下一行的列值相同

[英]SQL for setting column value same as next row's column value

我有這樣的桌子

--------------------------
id    some_column
--------------------------
1      null
2      abc
3      null
4      null
5      def
6      ghi

在我的場景中,表中的某些初始行在some_column中為null。 所有最新的行均已正確設置some_column值

我想運行一個查詢,該查詢可以通過從下一個非null值復制值來替換some_column的所有null值。

例如,運行查詢后,表將變為

--------------------------
id    some_column
--------------------------
1      abc
2      abc
3      def
4      def
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

您可以使用帶排序和限制的相關子查詢來獲取空值后的第一個非空值,請參閱選擇相關子查詢的演示 ,以下查詢將使用下一個非空值更新列的空值

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

演示版

您可以使用JOIN來做到這一點:

UPDATE t AS t0
JOIN (
    SELECT t1.id, MIN(t2.id) new_id
    FROM t AS t1
    JOIN t AS t2 ON t1.id < t2.id
    WHERE t1.some_column IS NULL
    AND t2.some_column IS NOT NULL
    GROUP BY t1.id) AS tnew ON t0.id = tnew.id
JOIN t AS t3 ON t3.id = tnew.new_id
SET t0.some_column = t3.some_column

tnew子查詢將具有空值的每個ID與具有非空值的下一個最高ID匹配。 然后,我將其與原始表連接兩次,以將要更新的行與該行的值與替換值配對。

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM