我有一个名为DUTY
的表(列:dutyid, dutyname, staffid
)和一个名为STAFF
的表(列:staffid, staffname
)
为了公平起见,每名工作人员将自动分配到每个职责录入(记录)。那么每当我想插入一个职责条目时,我该怎么办呢,它会为它自动分配staffid
(顺序)。
实施例
因此,当我插入一个新条目(第一个条目)时,它将自动插入staffid = 1
作为职责表。对于第二次输入,staffid
将为2。
对于以下条目,它将继续循环staffid
。
期望的答案:
dutyid dutyname staffid
1 cleaning 1
2 cleaning 2
3 cleaning 1
4 cleaning 2
5 cleaning 1
6 cleaning 2
7 cleaning 3 new staff
8 cleaning 1
9 cleaning 2
10 cleaning 3
任何人都可以向我展示并解释我在存储过程中应该做些什么...... 感谢
答案 0 :(得分:0)
请参阅sqlfiddle
此查询将返回下一个员工编号并循环回到第一个
SELECT max(staffid) FROM
(
SELECT top 1 staff.staffid
FROM staff, (
SELECT top 1 staffid
FROM duty
ORDER BY id DESC
) d
WHERE staff.staffid > d.staffid
Order by staff.staffid
UNION
SELECT top 1 staffid
FROM staff
ORDER BY staffid
) x
答案 1 :(得分:0)
另一种方法是使用职责表来获得下一个分配最少的工作人员。
select top 1 staffID,count(*)
from duty
group by StaffId
order by 2
现在,随着每项新职责的插入,职责最少的职员获得新的职责。当然,如果不经常分配工作人员,这个解决方案可能会导致一个问题,即当添加新的工作人员时,他会在一段时间内完成所有的工作任务。
答案 2 :(得分:0)
您可以使用SCOPE_IDENTITY获取上次自动生成的ID:
declare @last_id int
-- assumes staffid is an auto generated key (identity)
insert into STAFF (staffname)
values ('JACK')
select @last_id = SCOPE_IDENTITY()
insert into DUTY (dutyid, dutyname, staffid)
values (1, 'duty-name-jack', @last_id)
insert into STAFF (staffname)
values ('MARY')
select @last_id = SCOPE_IDENTITY()
insert into DUTY (dutyid, dutyname, staffid)
values (2, 'duty-name-mary', @last_id)
答案 3 :(得分:0)
试试这个:
select * from duty;
Declare @dutyname varchar(20)='cleaning'
Declare @staffid int
Declare @maxstaffid int
select @staffid=staffid from duty
where dutyid=
(select max(dutyid) from duty);
select @maxstaffid=max(staffid) from staff;
print @maxstaffid;
insert into duty (dutyname, staffid)
select @dutyname,
case
when @staffid=@maxstaffid then (select min(staffid) from staff)
else (select min(staffid) from staff where staffid>@staffid)
end ;
select * from duty;