「hi」、「hello」、「goodbye」、「good day」、「howdy」というリストを (この順序で) SQL テーブルで表現したいとします。
pk | i | val
------------
1 | 0 | hi
0 | 2 | hello
2 | 3 | goodbye
3 | 4 | good day
5 | 6 | howdy
「pk」は主キー列です。その値は無視してください。
「i」は「val」列の値の順序を定義する「インデックス」です。のみ順序を確立するために使用され、値はそれ以外では重要ではありません。
私が抱えている問題は、順序を維持しながらリストに値を挿入することです。たとえば、「hey」を挿入して、それを次のように表示したい場合、間「hello」と「goodbye」の場合、新しいエントリのためのスペースを確保するために、「goodbye」と「good day」(できれば「howdy」ではない)の「i」の値をシフトする必要があります。
では、シフト操作を実行して、必要な要素のみをシフトする標準 SQL パターンはありますか? (単純な「UPDATE table SET i=i+1 WHERE i>=3」は機能しないことに注意してください。これは、「i」の一意性制約に違反し、「howdy」行を不必要に更新するためです。)
または、順序付きリストを表現するより良い方法はありますか? 'i' を浮動小数点値にして、その間の値を選択することはできると思いますが、そのような値が存在しない場合は、別の再バランス操作を行う必要があります。
または、「i」を varchar にした場合、任意の他の文字列の間に文字列値を生成するための標準的なアルゴリズムはありますか?
それとも、リンク リストとして表現するべきでしょうか? すべての要素を順番に取得するために SELECT .. ORDER BY も実行できるようにしたいので、それを避けていました。
ベストアンサー1
あなたの投稿を読んでいると、私はずっと「リンク リスト」について考えていましたが、結局、それが正しい方法だと思っています。
Oracle を使用しており、リンク リストが別のテーブルである場合 (または自己参照 ID を持つ同じテーブルであっても、これは避けるべきです)、CONNECT BY クエリと疑似列 LEVEL を使用して並べ替え順序を決定できます。