1

このようなテーブルがあります

id アイテム ユーザー スロット

SLOT をユーザー ID に依存させたい。

4つの列がある場合

id: 1
user: 1
item: 1
slot: 1

id: 2
user: 1
item: 1
slot: 2

id: 3
user: 1
item: 2
slot: 3

id: 4
user: 1
item: 2
slot: 4

新しいアイテムを追加すると、自動的にスロット 5 が割り当てられるはずです。しかし、最初に、たとえば、削除した場合 (スロット 2 を削除するか、別のスロットに移動すると、新しいアイテムはスロット番号 2 を取得する必要があります。これは SQL で可能ですか?

スロットは基本的に「アイテム」列が配置される位置です。

インベントリは次のようになります。

1 2 3 4 5
6 7 8 9 10
11 12 13 14
15 16 17 18
19 20

1 ~ 20 の数字はスロットです。たとえば、上の 4 つのスロットがアイテムによって占有されている場合、次のアイテムには 5 を割り当てる必要があります。しかし、アイテム (スロット 2 など) をスロット 20 のように移動すると、次のアイテムは番号 2 に配置する必要があります。今は取られていません。3 と 4 の両方が削除され、アイテムが追加された場合、3 に配置されます。

4

2 に答える 2

1

挿入トリガーを使用してスロットを更新するか、挿入時に最初に使用可能なスロットを自分で決定することができます。

最初の空きスロット数の決定については、他の人が述べているようにサイクリックチェックを使用するか、少しクリエイティブにすることができます。

SELECT min(rnumber)
from (SELECT slot, row_number() OVER (order by slot) as rnumber from <table_name> where slot is not null) as t
where slot <> rnumber

これにより、最小の空きスロットが取得されます。すべてのスロットが使用される場合、戻り値はnullになります。max(slot)+1で次のスロットを取得する必要があります。isnull(min(rnumber), (select max(slot)+1 from <table_name>)min(rnumber)の代わりに使用できるため、最終的なクエリは次のようになります。

SELECT isnull(min(rnumber), (select max(slot) + 1 from <table_name>))
from (SELECT slot, row_number() OVER (order by slot) as rnumber from <table_name> where slot is not null) as t
where slot <> rnumber
于 2011-12-08T08:55:29.597 に答える
1

オプション1

挿入用のテーブルにトリガーを作成する必要があります。

次に例を示します。

create trigger forinsertrig1 
on salesdetail 
for insert 
as 
if (select count(*) 
    from titles, inserted 
    where titles.title_id = inserted.title_id) !=
    @@rowcount 
/* Cancel the insert and print a message.*/
  begin
    rollback transaction 
    print "No, the title_id does not exist in
    titles." 
  end  
/* Otherwise, allow it. */
else
  print "Added! All title_id’s exist in titles."

しかし、トリガーでは、値を持たない (最後に挿入された) スロットを更新して、最初に欠落している ID の値にします。

最初の欠落 ID を検出するには、次の手順を実行できます。

  1. テーブルから min(id) を選択します
  2. ID をインクリメントし、テーブルから行を選択するサイクルを作成します。行がない最初のもの、それはあなたの欠けているスロットです

オプション 2

Elzo Valugiが述べたように、インクリメント ロジックを使用して、次に利用可能なスロットを返す関数を作成し、挿入時に直接エントリを作成する別の可能性があります。

于 2011-12-07T16:11:58.537 に答える