3

私は値を持つこのテーブルを持っています:

val  
1
2
3
7
8
9

テーブルには id 列もありますが、現在は関係ありません。

1 つの値を挿入したいのですが、値を繰り返すことはできないという規則があります。新しい 2 を挿入するとします。現在の 2 は 3 になり、値 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 つのクエリで挿入/更新全体を行うより良い方法も非常に高く評価されます。

4

1 に答える 1

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)
  );
于 2012-07-15T15:31:43.107 に答える