使用SQLite从n中查找连续的行

时间:2012-07-15 14:58:28

标签: sql sqlite

我有这个表的值:

val  
1
2
3
7
8
9

该表还有一个id列,现在不相关。

我想插入一个值,但规则是不能有任何重复值。假设我插入一个新的2,当前的2应该变为3,依此类推,直到值3,这将变为4.在这种情况下,值7,8和9不需要'移动”。

我正在使用 SQLite 。在所需的新值持有者被“移动”之后,插入或更新部分可以在单独的查询中完成。

到目前为止,我正在这样做:

//being n my new value.
UPDATE values SET val = val+1 WHERE val >= n 

但这也会修改7,8和9,不需要修改。

关于如何解决这部分问题的任何想法?将更新限制为仅连续值?

在一个查询中执行整个插入/更新的更好方法也将非常受欢迎。

1 个答案:

答案 0 :(得分:2)

解决方案#1 LEFT JOIN

http://sqlfiddle.com/#!5/7eeea/12

UPDATE t
SET val = val+1
WHERE val >= 2
  AND val <= (
    SELECT MIN(t1.val)
    FROM      t AS t1
    LEFT JOIN t AS t2 ON t1.val+1 = t2.val
    WHERE t1.val >= 2
      AND t2.val IS NULL
  );

解决方案#2 NOT EXISTS

http://sqlfiddle.com/#!5/7eeea/17

UPDATE t
SET val = val+1
WHERE val >= 2
  AND val <= (
        SELECT MIN(t1.val)
        FROM  t AS t1
        WHERE t1.val >= 2
          AND NOT EXISTS (SELECT 1 FROM t AS t2 WHERE t1.val+1 = t2.val)
  );