对于Postgres Update records that satisfies a condition with incrementing number,这是一个问题的副本,但我需要一种适用于SQLite3的方法。
从原始问题中删除:
SNIP
我有一张像这样的postgres表:
Id Name local_site_id local_id
1 A 2
2 B 2
3 C 1
4 D 2
5 E 1
如何使用SQL查询将表更新为:
Id Name local_site_id local_id
1 A 2 1
2 B 2 2
3 C 1
4 D 2 3
5 E 1
现在,对于所有记录,local_id字段为空。我想使用从1开始的递增数字更新local_id值仅适用于local_site_id=2
的行是否可以使用SQL?
END-SNIP
我在answer尝试了此命令,但它不适用于SQLite3
update T set local_id=s.rn
from (select id,row_number() over(order by id) as rn from T where local_site_id=2) s
where T.id=s.id;
如何在SQLite3中实现这一目标?
答案 0 :(得分:1)
这应该这样做:
.mode column
.headers on
create table T (Id, Name, local_site_id, local_id);
insert into T values
(1, 'A', 2, null),
(2, 'B', 2, null),
(3, 'C', 1, null),
(4, 'D', 2, null),
(5, 'E', 1, null);
update T set local_id = (
select
case local_site_id
when 2 then (select count(*)
from T t2
where t2.id <= t1.id and local_site_id=2)
else null
end
from T as t1 where T.id=t1.id);
select * from T;
返回:
Id Name local_site_id local_id
---------- ---------- ------------- ----------
1 A 2 1
2 B 2 2
3 C 1
4 D 2 3
5 E 1
答案 1 :(得分:0)
create table temptable as select id from tablename where local_site_id=2;
update tablename
set local_id=(select ROWID from temptable where temptable.id=tablename.id)
where exists (select ROWID from temptable where temptable.id=tablename.id);
但我会接受Ludo的回答,因为它不涉及创建新表。