2012-07-15 44 views
3

我有此表的值:查找n個連續的行使用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

刪除單行就像當你也重新編號值'更新值S ET val = val-1 WHERE val> = n'。這樣,你將始終有連續的數字,並可以再次使用'UPDATE值SET VAL = VAL + 1 WHERE VAL> = n'。不是最佳的,但工作。 – PhilMasterG 2012-07-15 15:26:35

+0

謝謝你的想法,但非連續性的來源是用戶。這個值被用作優先級,用戶可以重新分配一個任務的優先級,並在1到20的範圍內給它賦予一個隨機優先級。 – 2012-07-15 15:31:03

+0

如果'val'列有一個實際的'UNIQUE'約束,那麼你可能需要'UPDATE ... ORDER BY',不幸的是,它默認情況下不會被編譯爲SQLite。 http://www.sqlite.org/lang_update.html – biziclop 2012-07-15 15:38:09

回答

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

很好的回答,很好的研究,我不知道sqlfiddle。我會說你需要在比較部分中將任何值賦予整數CAST(val AS INTEGER),以使其工作,至少在我的情況下,因爲我已經在那裏將關聯設置爲STRING。你的解決方案工作完美,我個人去第二個這是我瞭解它是如何工作的。 – 2012-07-16 10:07:11

+1

第一個變體的小插圖:http://sqlfiddle.com/#!5/7eeea/22 :) – biziclop 2012-07-16 11:11:42

+0

+1非常感謝你!我終於將這個解決方案應用於我過於臃腫的查詢xD,再次感謝。 – 2012-07-17 06:27:42