2016-05-14 52 views
0

我在管理表中添加了一個新列。我希望將修訂列填入effective_date列。sql:在表格中插入新列

 ALTER TABLE home.prod ADD revision int; 

版本號將從100開始並增加1.修訂版本將基於effective_date。所以,最老的eff_date將得到100,然後下一個最老的將得到101,依此類推。

  Eff date 1/1/2012 – Revision 100 
      Eff date 1/1/2013 – Revision 101 
      Eff date 7/1/2014 – Revision 102 
      Eff date 1/1/2015 – Revision 103 

像本聲明中

  revision =100 
      UPDATE prod.admin 
      SET revision= revision+ 1 
      WHERE eff_date = /' 
+0

哪[標籤:rdbms]你在用嗎? MySQL或SQL Server? – Mureinik

回答

1

在MySQL中,你可以做

UPDATE prod.admin 
CROSS JOIN (select @rev := 99) r 
SET revision = (@rev := @rev + 1) 
ORDER BY eff_date asc 
0

不幸的是,MySQL不允許JOINUPDATE查詢與ORDER BY。一種方法是:

SELECT @rn := 99; 

UPDATE prod.admin 
    SET revision = (@rn := @rn + 1) 
    ORDER BY eff_date ASC; 

如果你可以假設@rn開始與NULL值,你可以這樣做:

UPDATE prod.admin 
    SET revision = (@rn := COALESCE(@rn, 100), @rn + 1) 
    ORDER BY eff_date ASC; 

在SQL Server中,你會怎麼做:

WITH toupdate as (
     SELECT a.*, ROW_NUMBER() OVER (ORDER BY eff_date) as seqnum 
     FROM prod.admin 
    ) 
update toupdate 
    SET revision = seqnum;