在T-SQL中更新每个类别

时间:2014-08-22 11:33:30

标签: sql sql-server tsql

我有一张这样的表:

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只返回一个日期。有任何想法如何实现此更新?

2 个答案:

答案 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