“Slot”取决于用户ID等sql

时间:2011-12-07 16:02:14

标签: sql gaps-and-islands

我有一张这样的表

  

id item用户广告

我希望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?

Slot基本上是“item”行所在的位置。

库存看起来像这样:

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。

2 个答案:

答案 0 :(得分: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并从表中选择行。第一个没有一行,这是你缺少的插槽
  3.   

    选项2

    另一种可能性,如Elzo Valugi所述,是使用增量逻辑构建一个函数,该函数将返回下一个可用的槽并直接在插入上创建条目。

答案 1 :(得分: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