簡體   English   中英

TSQL-如何使用迭代更新表中的列

[英]TSQL - How to Update a column in a table with iteration

我有2張桌子,任務和職員。 這些都在關系數據庫中。

表更新之前 在此處輸入圖片說明

我想做的是使用4個staffID(1,2,3,4)更新Tasks表中的StaffID列,並在迭代中進行,這樣最終結果將是:

表格更新后

這樣,StaffID'1'將具有任務1、5、9等,以及所有其他staffID都在做相同的事情。 到目前為止,我的查詢看起來像這樣,但是我確定我遺漏了很多東西:

update Tasks
set StaffID = 2
where

這就是我所擁有的,在那之后我需要做的事情讓我感到困惑。 任何與此有關的幫助或指向文檔的鏈接,這些文檔都顯示了如何執行此操作,將非常有用。

create table task as
WITH tasks as 
(select 1 taskid,1 staffid, 'Task 1' title,getdate()-1 createdDate union all
select 2 taskid,1 staffid, 'Task 2' title,getdate()-2 createdDate union all
select 3 taskid,1 staffid, 'Task 3' title,getdate()-3 createdDate union all
select 4 taskid,1 staffid, 'Task 4' title,getdate()-4 createdDate union all
select 5 taskid,1 staffid, 'Task 5' title,getdate()-5 createdDate union all
select 6 taskid,1 staffid, 'Task 6' title,getdate()-6 createdDate union all
select 7 taskid,1 staffid, 'Task 7' title,getdate()-7 createdDate union all
select 8 taskid,1 staffid, 'Task 8' title,getdate()-8 createdDate union all
select 9 taskid,1 staffid, 'Task 9' title,getdate()-9 createdDate 
)
SELECT * FROM tasks

update task
set staffid =  case when mod(taskid,4) =1 then 1
                 when mod(taskid,4) =2 then 2
                 WHEN mod(taskid,4) =3 then 3
                 WHEN mod(taskid,4) =0 then 4
            end from task b
where taskid=b.taskid;

如果您知道taskid沒有空格,那么對其進行算術即可解決您的問題。 否則,您可以使用row_number()

with toupdate as (
      select t.*, row_number() over (order by t.taskid) as seqnum
      from tasks t
     )
update toupdate
    set staffid = ((seqnum - 1) % 4) + 1;

您可以使用它來分配人員來執行任務,請閱讀注釋以適應您的需求(如果需要)。

DECLARE @AmountStaffToAssign INT = 4

;WITH SequentialStaffIDs AS
(
    -- Get a sequential ID asigned to each of your StaffID (if not already sequential)
    SELECT TOP (@AmountStaffToAssign)
        S.StaffID,
        SequentialID = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM
        Staff AS S
    -- You can filter your staff to reassign here and also order them
),
SequentialTaskIDs AS
(
    -- Get a sequential ID asigned to each of your TaskID (if not already sequential)
    SELECT
        S.TaskID,
        SequentialID = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM
        Task AS S
    -- You can filter you tasks to be assigned here
),
TaskReassignment AS
(
    SELECT
        T.TaskID,
        T.SequentialID,
        StaffSequentialID = ((T.SequentialID - 1) % @AmountStaffToAssign) + 1
    FROM
        SequentialTaskIDs AS T
)
UPDATE T SET
    StaffID = S.StaffID
FROM
    Task AS T
    INNER JOIN TaskReassignment AS R ON T.TaskID = R.TaskID
    INNER JOIN SequentialStaffIDs AS S ON R.StaffSequentialID = S.SequentialID

這是我的答案: https : //sqleditor.net/q/rk6YcdEtM

UPDATE T SET StaffID = S.StaffID
FROM (
  SELECT ROW_NUMBER() OVER (ORDER BY TaskID) % (SELECT COUNT(*) FROM Staff) AS seq, StaffID FROM Tasks
 ) T
INNER JOIN (
  SELECT ROW_NUMBER() OVER (ORDER BY StaffID) % (SELECT COUNT(*) FROM Staff) AS seq, StaffID FROM Staff
) S ON T.seq = S.seq;
GO

您可以在此處嘗試更多詳細信息: https : //sqleditor.net/q/rk6YcdEtM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM