子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录

Posted

技术标签:

【中文标题】子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录【英文标题】:Subquery returned more than 1 value - Updating records over a date range with values from a specific date 【发布时间】:2021-01-22 22:56:08 【问题描述】:

我正在尝试更新比“2020-10-12”新的记录的 LocationNumber 值。更新的记录应该是那些 LocationNumber 不等于“2020-10-10”的记录。 12 日之后,某些记录的 LocationNumber 值变得不正确,所以我正在尝试修复它们。

编辑:记录必须存在于“2020-10-10”,我不想更新该日期不在系统中的新记录。

以下是我尝试过的选项:

update ReadHeader as z0
set locationnumber = z1.locationnumber
from ReadHeader as z1
where z1.identifier = z0.identifier
and z1.LocationNumber in(select LocationNumber from ReadHeader where ReadLogDate = '2020-10-10')
and z0.LocationNumber in(select LocationNumber from ReadHeader where ReadLogDate > '2020-10-12')
and z0.LocationNumber not in(select LocationNumber from ReadHeader where ReadLogDate = '2020-10-10')




update ReadHeader SET LocationNumber = (SELECT LocationNumber from ReadHeader where ReadLogDate = '2020-10-10')
where ReadLogDate > '2020-10-12' 
and LocationNumber not in(select LocationNumber from ReadHeader where ReadLogDate = '2020-10-10')

示例数据,每天都有新读取的数千个唯一“标识符”,我只想修复那些在 '2020-10-12' 之后具有不正确 LocationNumbers 的那些

Identifier       LocationNumber       AcctNum       ReadLogDate    Read Value

T108468264          336086           94103494      '2020-10-10'        5
T108468264          336086           94103494      '2020-10-11'        8
T108468264          888888           94103494      '2020-10-12'        19
T108468264          888888           94103494      '2020-10-13'        25
T108468264          888888           94103494      '2020-10-14'        30

需要的结果:

Identifier       LocationNumber       AcctNum       ReadLogDate    Read Value

T108468264          336086           94103494      '2020-10-10'        5
T108468264          336086           94103494      '2020-10-11'        8
T108468264          336086           94103494      '2020-10-12'        19
T108468264          336086           94103494      '2020-10-13'        25
T108468264          336086           94103494      '2020-10-14'        30

感谢任何帮助!

【问题讨论】:

请提供样本数据和期望的结果。 根据您的要求更新@Gordon Linoff 【参考方案1】:

嗯。 . .使用可更新的 CTE:

with toupdate as (
      select rh.*,
             max(case when ReadLogDate = '2020-10-12' then locationnumber end) over (partition by identifier) as locationnumber_20201012
      from ReadHeader rh
     )
update toupdate
    set locationnumber = locationnumber_20201012
    where readlogdate > '2020-10-12';

【讨论】:

添加示例数据和所需结果,如果这对您的答案有影响! @Tonno22 。 . .我不知道您是否想要每个identifier 或帐户,但您可以查看如何获取价值。 每个标识符!这个答案很完美,让我得到了我需要的结果。谢谢!

以上是关于子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录的主要内容,如果未能解决你的问题,请参考以下文章

子查询返回超过 1 个值 - 我的触发器无法处理多个行更新

子查询返回超过 1 个值。当子查询跟随 = 或子查询用作表达式时,这是不允许的

子查询返回超过 1 个值。这是啥意思?

存储过程生成 msg 512 子查询返回超过 1 个值

SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=

子查询在 sqlc# 中返回超过 1 个值