2017-11-22 1 views
0

私は製品を含むボックスを含むデータベースを持っています。SQLは複数の値を減らします

- GUIDParent : GUID of the product 
- GUIDChild : GUID of the box 
- DateDelete : if set association has been deleted 
- Order : index of product in box 

アソシエーションを削除するためのストアドプロシージャを作成しました(今すぐDateDeleteを設定します)。しかし、どのようにしてテーブルの順序を更新するコマンドを書くことができますか?

例:

- Product0 | Box1 | NULL | 0 
- Product1 | Box1 | NULL | 1 
- Product2 | Box1 | NULL | 2 
- Product3 | Box1 | NULL | 3 
- Product4 | Box1 | NULL | 4 

削除Product2:

- Product0 | Box1 |  NULL  | 0 
- Product1 | Box1 |  NULL  | 1 
- Product2 | Box1 | 22/11/2017 | 2 (Or NULL ?) 
- Product3 | Box1 |  NULL  | 2 
- Product4 | Box1 |  NULL  | 3 

は私が実際に(簡易版)を持っている:今、私は少し良くあなたの質問を理解していることを

ALTER PROCEDURE [deleteLink] 
    @guidParent uniqueidentifier, 
    @guidChild uniqueidentifier 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRANSACTION 

     UPDATE ASSOTABLE SET DateDelete=GETDATE(),DateUpDate=GETUTCDATE() 
     WHERE GUIDParent = @guidParent AND GUIDChild = @guidChild 

    COMMIT TRANSACTION 
    RETURN 0; 

END 
+0

これまでに何を試してみましたか?どのような問題が発生しましたか? 'UPDATE ASSOTABLE SET DateDelete = GETDATE()、DateUpDate = GETUTCDATE()、order = null'でしたか? 私にはうまくいくはずです... – Sander

+1

@Sander問題は、Product2.OrderをNULLに設定するのではなく、Product3と4の順序を減らすことです。 –

答えて

1

、私は思います[削除された]行の順番より上の[順序]ですべての行を更新する必要があります。

ですから、あなたがそうのように削除しようとしている[順序]の変数を設定することができます。

declare @deletedOrder INT 
set @deletedOrder = select [order] from ASSOTABLE 
    WHERE GUIDParent = @guidParent AND GUIDChild = @guidChild 

update ASSOTABLE 
set [order] = [order]-1 
where [order] > @deletedOrder 

この方法は、あなたが削除したためより大きいすべての注文は、デクリメントされます私は 'order'はSQLの非常に一般的な用語であるので、私はcolumnnameとしてそれを使用しないことをお勧めします。さもなければ、あなたは「順序による注文」のようなフレーズを含むクエリに陥ります。これは混乱したり、エラーにつながることさえあります。個人的には、私は 'シーケンス'を使用したいと思います。

+1

いいです、ありがとうございます。名前について心配しないでください、私は他の用語 'order'、 'DateDelete'などを使用しています。 –

関連する問題