0

DUTY(columns: dutyid, dutyname, staffid) というテーブルと (columns: ) というテーブルがありSTAFFますstaffid, staffname

公平を期すために、各スタッフは各職務エントリ (レコード) に自動的に割り当てられます。では、義務エントリを挿入したいときはいつでもどうすればよいでしょうかstaffid。(順次) が自動的に割り当てられます。

  • スタッフ ID : 1 スタッフ名: ジャック
  • スタッフ ID : 2 スタッフ名: メアリー

したがって、義務の新しいエントリ (最初のエントリ) を挿入するstaffid = 1と、義務テーブルが自動的に挿入されます。2 番目のエントリの場合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 

ストアドプロシージャで何をすべきかを誰かに見せて説明してもらえますか...ありがとう

4

4 に答える 4

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
于 2013-05-06T02:06:01.013 に答える
0

もう 1 つの方法は、職務テーブルを使用して、最も使用頻度の低いスタッフ メンバーを次に割り当てることです。

select top 1 staffID,count(*)
from duty
group by StaffId
order by 2

これで、新しい職務が挿入されるたびに、職務の数が最も少ないスタッフ メンバーが新しい職務の挿入を取得します。もちろん、スタッフ メンバーが頻繁に割り当てられない場合、このソリューションでは、新しいスタッフ メンバーが追加されたときに、しばらくの間すべての職務割り当てを取得するという問題が発生する可能性があります。

于 2013-05-06T02:09:50.230 に答える
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)
于 2013-05-06T02:11:04.760 に答える
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;
于 2013-05-06T06:21:39.827 に答える