Sql 从另一个表更新行的存储过程

Sql 从另一个表更新行的存储过程,sql,join,stored-procedures,datatable,sql-update,Sql,Join,Stored Procedures,Datatable,Sql Update,重点是更新**(从0更改为1)**MHS的John doe的花名册表(第1周、第2周、第16周),当他使用电话号码登记时。apptable在created date列中捕获签入日期,该列应等于week date表中的第1周日期 如果John doe试图从JHS登记,则花名册表不应更新。 有关清晰度和详细信息,请参见图 当前状态: 预期结果: 名册表(当前状态) 工作日表: SchoolUID School Week1 Week2 1 MHS 9/7/2020

重点是更新**(从0更改为1)**MHS的John doe的花名册表(第1周、第2周、第16周),当他使用电话号码登记时。apptable在created date列中捕获签入日期,该列应等于week date表中的第1周日期

如果John doe试图从JHS登记,则花名册表不应更新。 有关清晰度和详细信息,请参见图 当前状态: 预期结果:

名册表(当前状态)

工作日表:

SchoolUID School  Week1      Week2 
1         MHS     9/7/2020   9/14/2020 
2         JHS     9/8/2020   9/15/2020
名册表(登记后的预期结果)

应用程序表

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;

也许我错了,但我假设您正在使用SQLServer

这是当您希望基于另一个表中的数据更新一个表时执行update语句的方法:

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语句如下所示:

    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone
    where roster.some_column = getdate();
这里是演示,我创建了两个表只是为了测试。然后我测试了update语句,然后测试了过程


你能和我们分享一下你使用的是什么数据库吗?我猜是SQL Server。但也可能是Sybase。为方便您提供帮助,向我们展示一些示例表数据和预期结果(格式文本,无图像),并首先看一看。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你的期望,说出你的期望和原因。谢谢vboka。这很有帮助。是的。我正在使用sql。如果目标表中有16个星期(16列),我是否要对所有16个星期重复相同的更新查询?问题是,所有16周都有不同的日期,这是另一个表(工作日表)。如何在查询中连接此项。谢谢vboka。这很有帮助。是的。我正在使用sql。如果目标表中有16个星期(16列),我是否要对所有16个星期重复相同的更新查询?问题是,所有16周都有不同的日期,这是另一个表(工作日表)。如何在update查询的where语句中连接它?例如,如果dbo.weekdate中的第1周日期=9/7/2020,但john doe可以在9/7周内的任何一个工作日签入,我该如何编写查询的这一部分呢。。你看,问题是我不明白这是为了什么,为什么(你为什么要更新这个专栏,以及在什么条件下更新)。了解这一点会很好,然后更多的人可以帮助你。更好地理解您的问题的一种方法是,为我们提供这3个表的示例数据(每个表只有3-4行数据),并在update语句后与我们共享预期结果。我已对原始问题进行了编辑。请让我知道,如果我需要进一步澄清。嗨@OBB,你需要:1。将表格数据添加为文本而不是图像。2.为apptable 3添加数据。在更新过程之后,按预期从tabler花名册中添加数据。。。
create procedure updtroster 
AS
begin
    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone;
end;
    update roster 
    set roster.week = 1
    from apptable a
    left join roster on a.UserPhoneNumber = roster.Participant1phone
    where roster.some_column = getdate();