2011-12-16 9 views
0

列が含まれているテーブル(int id pkey, int group, double sortOrder) sortOrderは、1つのグループ内でユーザー指定の並べ替え順序を実装しています。一部の変更では、グループ内のすべてのアイテムの並べ替え順を変更する必要があります。私は連続した値を代入する必要がありますwhchで、現在の順番で、私にそのグループ内のすべての要素を互いのindependen(つまり、彼らは唯一のこれまで1グループ内で比較されている)SQLite:シーケンシャル値を持つ複数行のUPDATE列

SELECT id, sortOrder FROM tbl WHERE group=X ORDER BY SortOrder 

を異なるグループ内SORTORDER値を与えています(1、2、3、...)をSortOrderに設定します。

Q:他のSQL実装に移植することはできますか?すべての行を個別に更新せずに実行する方法はありますか?


さらに詳しい情報:私はそれは自明終わりMIN-1前のため、MIN + 1のインサートのための他の項目を(変更せずに新しいソート順序を割り当てることができますので、ダブルスを使用して、としています(A + B)/2の間に挿入するためには2) - これは、もちろん、2倍分解能(最悪の場合には〜52個の挿入)によって制限される。とにかくこれがオーバーフローの追加検査の価値があるかどうかはまだわかりませんが、とにかく他のデータ型でも同じ問題があります。

私が思いついた唯一のアイデアは、文字列とカスタムのCOLLATEとADD/SUB/AVG関数で無限の解像度をシミュレートすることでした。しかし、これは非常にポータブルではないようです。

答えて

1

私は、SQLiteがこれを行うのは些細なことではないと思います。

これは本当に気になるものですが、整数ソートと配列を維持するアルゴリズムを実装することに固執しています。例えば、ソートに対するすべての変更は、/ダウン一つの場所にアイテムを移動伴い、場合あなたが移動することができるかどう

、あなただけ...両方の値のソート順序を入れ替えること

UPDATE table 
SET sort_order = CASE WHEN sort_order = 3 THEN 4 ELSE 3 END 
WHERE sort_order IN (3,4) 

必要か任意の位置にアイテム、何かのよう...

UPDATE table 
SET sort_order = CASE WHEN sort_order = @old THEN @new ELSE sort_order + 1 
WHERE sort_order >= @new AND sort_order <= @old 

を使用し、私はあなたが他の項目を毎回更新したくないんと言ったことを認識してんだけど、このは実際にはかなりあることが証明されを持っています効率の中では、ほとんど私のために過去の場合はの場合。

関連する問題