1

次の列を持つテーブルを考えてみましょう。

ID, Name, Rank

そして次のようなデータ:

100, John, 1
200, Steve, 2
300, Mike, 3
400, Ben, 4
500, Jake, 5

ランクはユニークです。

ベンにランク2を与え、それに応じて残りを更新して、最終的に

100, John, 1
400, Ben, 2
200, Steve, 3
300, Mike, 4
500, Jake, 5

ベンのランクを 2 に変更し、新しいランクと古いランクの間のすべての行を更新するよりも、これを行うためのよりスマートな方法はありますか?

4

4 に答える 4

2

ここに別の方法があります。これにより、重複キーの問題が回避されます (ランクに一意の制約があると仮定します)。ランクが現在のランクよりも低い場合に機能するように更新されました。

DECLARE @ID int, @NewRank int, @CurrentRank int, @LowRank int, @HighRank int
SET @ID=400
SET @NEWRANK=2

SELECT @CurrentRank = Rank FROM MyTable WHERE Id = @ID
SET @LowRank = CASE WHEN @NewRank < @CurrentRank THEN @NewRank ELSE @CurrentRank END
SET @HighRank = CASE WHEN @NewRank < @CurrentRank THEN @CurrentRank ELSE @NewRank END

UPDATE MyTable SET Rank = -Rank WHERE Rank BETWEEN @LowRank AND @HighRank

UPDATE MyTable SET Rank = @NewRank WHERE ID = @ID

UPDATE MyTable SET Rank = 
    CASE 
    WHEN @NewRank < @CurrentRank THEN  -Rank + 1
    ELSE -Rank - 1
    END
WHERE Rank < 0
于 2012-06-18T13:15:04.913 に答える
1

不必要に派手にしたい場合 (または、このようにする他の理由がある場合)、単一の更新クエリで移動される単一の行のランクを更新することを計画できる場合は、トリガーを使用して強制的に更新する他の行。これは次のように行われます。

CREATE OR REPLACE TRIGGER [dbo].[tr_RankChange]
  ON [dbo].[table_name]  Before UPDATE AS 
  BEGIN 
    Update [dbo].[table_name] Set Rank = Rank + 1 Where rank >= New.Rank
    Update [dbo].[table_name] Set Rank = Rank - 1 Where rank >= Old.Rank
  END

私は基本的に、それを行うことをお勧めするのではなく、それを行うことができることを指摘したかったのです. テーブルに適用される他のすべてのロジックに精通していない場合はお勧めしません。これが他のことが進行中の大規模なプロジェクトになる場合は、トリガーが複雑になる可能性があるため、非常に注意する必要があります。

于 2012-06-18T13:33:31.607 に答える
1

順序付けできる他の列に基づいて、夜のランクを動的に計算できますか? その場合、一部の RDBMS で ROW_NUMBER 関数を使用して、それに応じてランクを計算および更新できる場合があります。

そうでない場合、別の方法 (一種のチート) は、ランクに小数を使用し、Ben に 1.5 の値を割り当てることです:) これは、データベースから直接ランクを表示していないことを前提としています。

于 2012-06-18T12:53:17.897 に答える
1

いくつかのやり取りがあったため、これは私がこれを行う方法です (SQL Server 表記を使用):

SELECT @CurrentRank = Rank FROM TableName WHERE Id = @SelectedId

UPDATE TableName
SET Rank= 
CASE
    WHEN Id = @SelectedId THEN @NewSelectedRank
    WHEN @NewSelectedRank < @CurrentRank 
        AND Rank >= @NewSelectedRank AND Rank < @CurrentRank
    THEN Rank = Rank + 1
    WHEN @NewSelectedRank > @CurrentRank 
        AND Rank <= @NewSelectedRank AND Rank > @CurrentRank
    THEN Rank = Rank - 1
END
于 2012-06-18T13:10:36.490 に答える