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

标签 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。

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

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

最佳答案

使用 LEFT JOIN 的解决方案 #1:

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

NOT EXISTS 的解决方案 #2:

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

关于sql - 使用 SQLite 从 n 中查找连续的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11492932/

相关文章:

SQL将整数列连接到字符串

MySQL INSERT IGNORE 结果(记录是否添加)?

mysql - mysql 语法错误 : Befor Update Trigger

iPhone "unable to open database file"用于 xcode 应用程序中的 call_history.db

ruby-on-rails - sqlite3.rb :6:in require: libruby. so.2.2: 无法打开共享对象文件

php - 向表中添加额外的列

mysql - MySQL 中的模仿表( View 或存储函数)

ruby-on-rails - 如何将 Rails 应用程序中的数据从 mySql 迁移到 SQLite

android - 如何使用 volley 下载一定数量的 JSON

c++ - 在 Qt (C++) 中创建 SQLite 数据库