我有一张这样的表
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。
答案 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,您可以执行以下步骤:
选项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