我有一张这样的表:
id | ImportDate | ExpirationDate
1 | 2014-08-21 | 2014-08-21
1 | 2014-08-19 | 2014-08-20
2 | 2014-08-20 | 2014-08-20
2 | 2014-08-19 | 2014-08-19
现在我想只更新那些具有max(importDate)并将主题ExpirationDate设置为9999-12-31的行。所以第1行和第3行。代码是:
update table
set ExpirationDate = '9999-12-31'
Where
ImportDate = (SELECT MAX(ImportDate) FROM table
group by id
)
但我收到错误'子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 我似乎对我很生气,因为Subquery中的SELECT假设每个id只返回一个日期。有任何想法如何实现此更新?
答案 0 :(得分:2)
错误似乎不言自明。要修复它,您可以使用相关的子查询:
update t
set ExpirationDate = '9999-12-31'
from table t
Where ImportDate = (SELECT MAX(ImportDate)
FROM table t2
WHERE t2.id = t.id
)
答案 1 :(得分:2)
我更喜欢的另一种风格(因为它对我来说更具可读性)
with cte as (
select *
, row_number() over (
partition by [id]
order by [ImportDate] desc
) as [r]
from dbo.Table
)
update cte
set ImportDate = '9999-12-31'
where [r] = 1