【发布时间】:2021-04-04 11:17:49
【问题描述】:
我有三个表 Account、Solditems 和 Appointments。
当相关 SoldItems 和 Appointments 表中的日期差异大于 6 年时,我需要更新每个 Account 行的 IsOverSixYears 列。
一个账号可以有多个Solditems和多个Appointments,所以我需要找到最近售出的商品和最近的预约进行比较,IsOverSixYears标志要根据账号最近售出的商品和预约设置。
这是我的尝试,但结果不好:
Update AccountBase
Set IsOverSixYears=0
Update AccountBase
Set IsOverSixYears= Case
WHEN ABS(DATEDIFF(DAY,(Select Top (1) Si.SellDate order by Si.SellDate desc),(Select
Top(1)app.AppointmentDate order by app.AppointmentDate desc)))< 6*365
THEN 1
WHEN ABS(DATEDIFF(DAY,(Select Top (1) Si.SellDate),(Select Top(1)app.AppointmentDate)))>= 6*365
THEN 0
END
FROM [dbo].[AccountBase] acc inner join [dbo].[SoldItems] Si on acc.accountnumber = Si.accountnumber
inner join Appointments app on acc.AccountId=app.accountId
我认为内部选择有问题,因为这个查询给我的结果就像内部查询忽略了 order by 子句:
Select Si.SellDate,app.AppointmentDate,
(Select Top (1) Si.SellDate order by Si.SellDate desc) as Latest
FROM [dbo].[AccountBase] acc inner join [dbo].[SoldItems] Si on acc.accountnumber = Si.accountnumber
inner join Appointments app on acc.AccountId=app.accountId
Where Si.accountnumber='V033072'
结果:
SellDate AppointmentDate Latest
2006-07-06 00:00:00.000 2017-08-17 09:00:00.000 2006-07-06 00:00:00.000
2006-07-06 00:00:00.000 2017-08-17 09:00:00.000 2006-07-06 00:00:00.000
2011-08-08 00:00:00.000 2017-08-17 09:00:00.000 2011-08-08 00:00:00.000
2017-08-17 00:00:00.000 2017-08-17 09:00:00.000 2017-08-17 00:00:00.000
2011-08-08 00:00:00.000 2017-08-17 09:00:00.000 2011-08-08 00:00:00.000
它与销售日期没有什么不同。
我已经在日期时间字段上尝试过 Max 函数,但它给了我运行时错误:
聚合可能不会出现在 UPDATE 语句的集合列表中。
如何重写这个查询才能正常工作?
感谢您的帮助。
【问题讨论】:
-
您可能不需要多个嵌套子查询。您将需要包含示例数据以符合您的预期结果。
标签: sql sql-server datetime sql-update