3

この質問に関して SO に関する多くの質問を見てきましたが、私のシナリオに関連するものはありません。私は、基本的な CRUD 操作を行うことを除けば、SQL の専門家にはほど遠い存在です。したがって、私はこれにかなりこだわっています。

私はテーブルを持っています。

myTable [rID, newsID, OrderPosition]どこ;

rID is primaryKey int column, 
newsID int is the ID of an item from another table and,
OrderPosition int to hold the position of the rows. 

myTable には常に合計 10 行が含まれます。

したがって、最初に、myTable に次のデータがあると仮定します。

rID    newsID    OrderPosition
100    4000      1
101    4100      2
102    4200      3
103    4300      4
104    4400      5
105    4500      6
106    4600      7
107    4700      8
108    4800      9
109    4900      10

期待される機能は次のとおりです。

新規挿入

新しいアイテムを挿入するとき、ユーザーは好きな位置に挿入できる必要があります。今のところ、OrderPosition = 10 行を削除し、新しいレコード OrderPosition を 0 に割り当て、テーブルを並べ替えることで、新しいレコードを最初の位置に挿入することしかできませんでした。しかし、クライアントはアイテムをどの位置に配置するかを選択したいと考えています。その場合、 OrderPosition = 10 は再び削除されると思いますか?

消去

このテーブルからレコードが削除されると、常に合計 10 レコードになるため、別のテーブル [tblNews] から最後に入力されたレコードを取得し、10 番目の位置に挿入する必要があります (最後のレコードは tblNews から取得できます)。どのレコードが削除されるかわからないので、レコードが削除された後にテーブルを並べ替える方法がわかりません。

記事へのヘルプ、コード、方向性は非常に高く評価されます。

===========編集====================

回答に記載されている UPDATE メソッドは、私にとっては機能しません。たとえば、ユーザーは新しいレコードを 5 番目の位置に挿入したいと考えています。これは、注文位置 10 が削除され、注文位置 5、6、7、8、および 9 の現在のレコードが 1 つインクリメントされることを意味します。

4

4 に答える 4

4

このようなものがうまくいくと思います:

CREATE PROC uspMyTableInsert
(
    @newsID INT, @order int
)
AS
BEGIN

    UPDATE MyTable
    SET OrderPosition = OrderPosition + 1
    WHERE OrderPosition >= @Order;

    INSERT INTO MyTable VALUES (@newsID, @order);

    DELETE FROM dbo.myTable WHERE OrderPosition = 11


END

したがって、挿入するには3つのステップがあります:

まず、フォローするアイテムの順序を更新 (+1) し、次にアイテムを挿入し、最後に 11 行目を削除します。

削除の場合も同様です-3つのステップですが、最初に行を削除してから、次の行の順序を更新し(今回は-1)、最後に新しい10行目を挿入します.

CREATE PROC uspMyTableDelete
(
    @order int
)
AS
BEGIN

    DELETE FROM dbo.myTable WHERE OrderPosition =@order

    UPDATE MyTable
    SET OrderPosition = OrderPosition -1
    WHERE OrderPosition > @Order;

    INSERT INTO MyTable 
    SELECT TOP 1 newsID, 10 
    FROM tblNews ORDER BY newsID DESC


END

SQLFiddle デモ

于 2013-06-24T09:29:11.553 に答える
0

問題が何であるかはよくわかりませんが、助けようとします。

最初に、ColumnPosition が 10 個の異なる数値のみを持つ場合、(ソフトウェアのミスを避けるために) 固有の制約が必要です。

5 番目の位置に対してこれを行うとします。次のようにする必要があります。myTable (newsID, OrderPosition) 値 (val, 5) に挿入します。

これはトランザクション内で発生する必要があり、rID が自動インクリメント ID であると想定しています。

于 2013-06-24T09:15:49.313 に答える