【问题标题】:Stored procedure to update row from another table从另一个表更新行的存储过程
【发布时间】:2020-12-14 20:49:06
【问题描述】:

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

如果 John doe 尝试从 JHS 签入,则名册表不应更新。 请参阅图像以获得清晰和详细信息 当前状态:enter image description here 预期结果:enter image description here

名册表(当前状态)

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;

【问题讨论】:

  • 请您与我们分享您使用什么数据库?
  • 我猜是 SQL Server。但也可能是 Sybase。
  • 轻松为您提供帮助,向我们展示一些示例表数据和预期结果(格式文本,无图像。)并首先查看minimal reproducible example
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: sql join stored-procedures datatable sql-update


【解决方案1】:

也许我错了,但我假设您使用的是 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();

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

DEMO

【讨论】:

  • 感谢 vboka。这很有帮助。是的。我正在使用 sql。如果目标表中有 16 周(16 列),我是否只对所有 16 周重复相同的更新查询?问题是,所有 16 周都有不同的日期,这是另一个表(星期日期表)。如何在查询中连接它。
  • 感谢 vboka。这很有帮助。是的。我正在使用 sql。如果目标表中有 16 周(16 列),我是否只对所有 16 周重复相同的更新查询?问题是,所有 16 周都有不同的日期,这是另一个表(星期日期表)。如何在更新查询的 where 语句中连接它?例如,如果 dbo.weekdate= 9/7/2020 中的第 1 周日期,但 john doe 可以签入 9/7 周内的任何工作日,我该如何编写查询的该部分?
  • 嗨@OBB,嗯..你看,问题是我不明白这是为了什么以及为什么(你为什么要更新专栏以及出于什么原因/在什么条件下)。了解这一点会很棒,然后更多的人可以帮助您。更好地理解您的问题的一种方法是让您为我们提供所有这 3 个表的示例数据(每个表只有 3-4 行数据),并在更新语句后与我们分享预期结果。
  • 我已对原始问题进行了编辑。 见上文如果我需要进一步澄清,请告诉我。
  • 嗨@OBB,您需要: 1. 将表格数据添加为文本而不是图像。 2. 为 apptable 添加数据 3. 添加来自 tabler roster 的数据,正如您在更新过程之后所期望的那样......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多