简介
下面我将介绍两种解决方案来解决问题并执行正确的UPDATE。每个解决方案的末尾都有一个关于示例数据的实时示例。
我个人会选择 first 解决方案,但我不确定您的要求,因此发布了两种可能性。
第一个解决方案 - 更新整个表
解释在这里,代码向下滚动。
为此,我们将使用Row Value 构造(id, orderid),就像第二个解决方案一样。
它将根据orderid 找到最新的行,并仅更新给定(id, orderid) 对的那一行。更多信息包含在第二个解决方案的解释中。
我们还需要模拟row_number 函数来分配每一行的排名编号,找出每个id 的哪一行有最新的orderid,然后标记为1,以便能够只提取那些更新。这将允许我们在一个语句中为不同的 id 更新多行。 SQLite 将具有此功能 built in version 3.2.5 但现在,我们将使用子查询。
要生成行号,我们将使用这个:
select
*,
(select count(*) from mytable m1 where m1.id = m2.id and m1.orderid >= m2.orderid) as rn
from mytable m2
然后我们只需要过滤rn = 1上的输出,我们就有了我们需要的东西。
也就是说,整个 UPDATE 语句将如下所示:
代码
update mytable
set flag = 1
where (id,orderid) in (
select id, orderid
from (
select *, (select count(*) from mytable m1 where m1.id = m2.id and m1.orderid >= m2.orderid) as rn
from mytable m2
) m
where
m.rn = 1
and m.id = mytable.id
);
现场演示
这里是 db fiddle,可以根据示例数据查看此解决方案。
第二种解决方案 - 只更新一个 ID
如果您知道要更新您的 ID 并希望只为一个 id 运行 UPDATE 语句,那么这将起作用:
代码
update mytable
set flag = 1
where (id,orderid) in (
select id, orderid
from mytable
where id = 5
order by orderid desc
limit 1
);
说明
(id, orderid) 是一个名为Row Value 的结构,SQLite 会从左到右比较标量值。
来自文档的示例:
SELECT (1,2,3) = (1,2,3) -- outputs: 1
现场演示
这里是 db fiddle,可以根据示例数据查看此解决方案。