使用 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 更新语句的主要内容,如果未能解决你的问题,请参考以下文章