如何更新满足SQLite3中递增数字的条件的记录?

时间:2012-08-30 13:51:18

标签: sql sqlite sql-update

对于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中实现这一目标?

2 个答案:

答案 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)

我自己找到了一种方法。我创建了一个临时表,然后使用临时表的“ROWID”内部列来更新原始表。

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的回答,因为它不涉及创建新表。