SQL根据另一列

时间:2016-03-11 05:41:53

标签: sqlite sql-update

我正在使用sqlite。我有这样一张桌子

create table t (i integer, j integer)
insert into t values(100,210)
insert into t values(200,290)
insert into t values(300,100)
insert into t values(400,500)

I'd like to adjust the j column so that 
* j=j+10 if i=j+10 exist
* j=j-10 if i=j-10 exist

After the adjust the table would look like
select i,j from t
i   j
--- ---
100 200
200 300
300 100
400 500

是否有允许这样的UPDATE语法,或者我应该使用托管语言进行循环(在我的情况下为C)

我试着阅读UPDATE语句BNF,我猜CASE,应该有所帮助,但到目前为止我无法做到,我的问题是关于'存在'我如何检查UPDATE内部,计算'i'存在。

提前谢谢,欢呼。披

2 个答案:

答案 0 :(得分:3)

这是一个适用于您的问题的UPDATE语句。这不是我最喜欢的答案,因为它会更新所有记录,即使是那些符合您标准的j值的记录。这意味着某些触发器可能会不必要地触发。

UPDATE t
SET j = CASE WHEN i = j + 100 + 10 THEN j + 10
             WHEN i = j + 100 - 10 THEN j - 10
             ELSE j
        END

如果你不介意两个单独的UPDATE语句,那么你可以试试这个:

UPDATE t
SET j = j + 10
WHERE i = j + 100 + 10

UPDATE t
SET j = j - 10
WHERE i = j + 100 - 10

答案 1 :(得分:0)

我终于解决了它,不确定它是最好的方法,但这就是我的工作。

Before
select * from t
i   j
--- ---
100 210
200 290
300 100
400 500

First pass, fix the j with j+10 were we can find i=j+10
update t set j=j+10 where rowid in
     (select t.rowid from t,t as u where t.j+10=u.i)

select * from t
i   j
--- ---
100 210
200 300 <== only this got corectly updated
300 100
400 500

Second pass fix the j with j-10 were we can find i=j-10
update t set j=j-10 where rowid in
      (select t.rowid from t,t as u where t.j-10=u.i)"
select * from t
i   j
--- ---
100 200 <== only this one corectly updated
200 300
300 100
400 500

我想有更优雅的方法可以做到这一点。

干杯, 披