2012-08-30 57 views
0

這是Postgres Update records that satisfies a condition with incrementing number的這個問題的重複,但我需要一種可以與SQLite3一起工作的方式。如何使用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的實現這方面的工作?

回答

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       
+0

真棒..我通過創建一張新桌子發現了一個凌亂的方式..但我會接受你的正確答案.. :) – Vigneshwaran

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); 

但我會接受盧多的答案,因爲它不涉及創建一個新表。

相關問題