私は、属性のグループを格納しているテーブルを持っており、それらを一連の順序で並べています。属性(行)の1つが表から削除され、位置の順序が圧縮される可能性があります。例えばSQL行の塗りつぶしシーケンス
、私は本来、これらの値を設定した場合:削除された
+----+--------+-----+
| id | name | pos |
+----+--------+-----+
| 1 | one | 1 |
| 2 | two | 2 |
| 3 | three | 3 |
| 4 | four | 4 |
+----+--------+-----+
2行目に、すべての後続の行の位置は、ギャップを閉じるために、更新されるべきです。
+----+--------+-----+
| id | name | pos |
+----+--------+-----+
| 1 | one | 1 |
| 3 | three | 2 |
| 4 | four | 3 |
+----+--------+-----+
単一のクエリでこのアップデートを行う方法があります:結果はこのすべきですか?どうすればこのことができますか?
PS:システムが両方のエンジンをサポートするはずなので、SQLServerとOracleの両方の例をお勧めします。ありがとう!
更新:この理由は、ユーザーが自由に位置を変更することができ、新しい行を追加または削除することができるからです。ポジションはユーザーに表示されます。そのため、これらは常にコンシステンスシーケンスを表示する必要があります(このシーケンスは必要に応じて保存する必要があります)。
これはリソースの浪費になる可能性があります。基本的にはソートしてから、すべての行を注文番号で更新します。 300万のレコードを持ち、行1を削除するとどうなりますか? 2,999,999の更新を発行する必要があります! あなたはここで何を達成しようとしていますか?多分もっと良いものをデザインするのに役立つかもしれません。 – diagonalbatman
まあ、ここにポイントがあります。しかし、テーブルには数百行以上のデータが含まれていることは想定されていないため、パフォーマンスに大きな影響はありません(このクエリはおそらく100クエリのバッチの一部です。 –
ここでは並行処理は行われません。セッションBが「3」を削除すると同時にセッションAが「2」を削除すると、ロックの問題が発生します。バッチジョブの場合、それは問題ではないかもしれません。 –