【问题标题】:TSQL - How to Update a column in a table with iterationTSQL - 如何使用迭代更新表中的列
【发布时间】:2018-03-12 00:03:33
【问题描述】:

我有 2 张桌子,Tasks 和 Staff。这些在关系数据库中。

我想做的是用 4 个人员 ID (1,2,3,4) 更新 Tasks 表中的 StaffID 列,并在迭代中执行,因此最终结果将是:

这样,StaffID '1' 将有任务 1、5、9 等等,以及所有其他 StaffID 做同样的事情。到目前为止,我的查询看起来像这样,但我确定我错过了很多东西:

update Tasks
set StaffID = 2
where

这就是我所拥有的,我不知道在那之后我需要做什么。任何有关此的帮助或显示如何执行此操作的文档链接都会很棒。

【问题讨论】:

  • 员工id和分配给它的任务有什么关系,是否有另一个表定义了这种关系?
  • 你用的是什么数据库?
  • UdayrajDeshmukh 和事实,我已经更新了这个问题,我相信会回答你的问题
  • 您可以通过使用模式来实现,例如 SELECT *,MOD(taskid,4) FROM 任务。然后在更新查询中使用它与 case 例如 case when mod(taskid,4)=1 then 'X' when mod(taskid,4)=2 then 'Y' etc

标签: sql tsql sql-update iteration relational-database


【解决方案1】:
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;

【讨论】:

  • 我收到一条错误消息“‘MOD’不是可识别的内置函数名。”我忘了说我是用 TSQL 做的。
  • @Tscott 。 . .使用% 运算符。
【解决方案2】:

如果您知道 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;

【讨论】:

    【解决方案3】:

    您可以使用它来分配员工到任务,请阅读 cmets 以适应您的需求(如果需要)。

    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
    

    【讨论】:

      【解决方案4】:

      这是我的答案: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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2022-01-10
        • 2019-09-11
        相关资源
        最近更新 更多