首页 > 解决方案 > 从另一个表更新行的存储过程

问题描述

关键是更新**(从 0 更改为 1)** 名册表(第 1 周,第 2 周,....第 16 周),当他使用电话号码登记时,来自 MHS 的 John doe。apptable 捕获创建日期列中的签入日期,该日期应等于周日期表中的第 1 周日期。

如果 John doe 应尝试从 JHS 签入,则名册表不应更新。查看图片以获得清晰和详细信息 当前状态:在此处输入图片描述 预期结果:在此处输入图片描述

名册表(当前状态)

UID   Name      School   Participant1phone   Participant2phone   Week1   Week2 
1     John Doe  MHS      8324444444          8325555555          0       0 
2     Nia Long  JHS      6785555555          6784444444          0       0

工作日表:

SchoolUID School  Week1      Week2 
1         MHS     9/7/2020   9/14/2020 
2         JHS     9/8/2020   9/15/2020

名册表(签到后的预期结果)

UID Name        School  Participant1phone   Participant2phone   Week1   Week2
1   John Doe    MHS     8324444444          8325555555          1       1
2   Nia Long    JHS     6785555555          6784444444          1       1

应用表

ID  Userphonenumber     Created on
1   8324444444          9/7/2020
2   6785555555          9/15/2020

这是到目前为止的sql查询:

create procedure updtroster 
AS
begin
    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone
end;

标签: sqljoinstored-proceduresdatatablesql-update

解决方案


也许我错了,但我假设您使用的是 SQLServer ...

当您想根据另一个表中的数据更新一个表时,可以使用以下方式执行更新语句:

update roster 
set roster.week = 1
from apptable a
left join roster on a.UserPhoneNumber = roster.Participant1phone;

有了它,就很容易将其放入程序中:

create procedure updtroster 
AS
begin
    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone;
end;

如您所见,我只添加了我从您的问题中理解的连接条件。如果需要,您也可以添加其他条件。您可以将它放在 where 子句中,然后更新语句将如下所示:

    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone
    where roster.some_column = getdate();

这是我为测试目的创建了两个表的演示。然后我测试了更新语句,然后我测试了程序。

演示


推荐阅读