使用 max 更新语句

Posted

技术标签:

【中文标题】使用 max 更新语句【英文标题】:Update Statement with max 【发布时间】:2013-10-22 11:21:46 【问题描述】:

我的桌子看起来像

产品 ID 状态行 N0 startDate ENDdate 1 订购 3 1999 年 1 月 2 日 NULL 1 租用 1 02/04/2006 NULL 1 转租 4 2000 年 12 月 31 日 NULL 1 取消 9 2003 年 10 月 25 日 NULL 2 交付 5 1999 年 1 月 2 日 NULL 2 丢失 3 02/04/2001 空 2 取消 4 2000 年 12 月 31 日 NULL

我需要写一个更新语句 如果状态为取消,则 Product End Date 为 Max(linenumber) 的 StartDate

结果应该是这样的

ProductId     EndDate
1             10/25/2003  Date of line number(9)
2             01/02/1999  Date of line number(5)

谢谢

【问题讨论】:

您使用的是什么关系型数据库?您还想删除其他行吗? 首先尝试编写SELECT 语句,它将返回您想要的结果,然后简单地将SELECT 语句修改为UPDATE 如果是StartDate of max(linenumber),你是怎么得到02/04/2006 for productId 1的? 使用 sql server。 ProductId 1 的结束日期应为 2003 年 10 月 25 日 您需要更新特定产品的所有行还是只更新Cancelled 行? 【参考方案1】:

具有Cancelled 行的产品由以下给出:

select distinct productid from tbl where status='Cancelled'

这些的最大行号是:

select productid,max(lineno) n from tbl
where productid in (select distinct productid from tbl where status='Cancelled')
group by productid

对应的startdate由下式给出:

select a.productid pid,b.n,a.startdate d from tbl a
join (
  select productid,max(lineno) n from tbl
  where productid in (
    select distinct productid from tbl 
    where status='Cancelled'
    )
  group by productid
  )b on (a.productid=b.productid and a.lineno=b.n)

最后,要根据这个更新tbl,你应该:

update tbl set enddate=d
from (
  select a.productid pid,b.n,a.startdate d from tbl a
  join (
    select productid,max(lineno) n from tbl
    where productid in (
      select distinct productid from tbl 
      where status='Cancelled'
      )
    group by productid
    )b on (a.productid=b.productid and a.lineno=b.n)
 ) t
where productid=t.pid

如果您只需要更新相关lineno 的行,请将and lineno=t.n 添加到where 子句中。

【讨论】:

以上是关于使用 max 更新语句的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询派生表错误更新

如何使用内部连接更新行

使用 Varchar(Max) 源中的 case 语句的数据类型错误

mysql查询将字段更新为max(field)+ 1

for+if语句 和 仅用if语句 的程序效率

如何在MySQL中的INSERT语句中使用SELECT MAX?