在oracle sql中更新:1个表中的多行

时间:2016-02-24 08:08:15

标签: sql oracle sql-update

我是SQL的新手,我对使用更高级的查询和函数不满意。

所以,我有1张销售表:

 id   date         seller_name   buyer_name
---- ------------ ------------- ------------
 1    2015-02-02   null          Adrian
 1    2013-05-02   null          John B
 1    2007-11-15   null          Chris F
 2    2014-07-12   null          Jane A
 2    2011-06-05   null          Ted D
 2    2010-08-22   null          Maryanne A
 3    2015-12-02   null          Don P
 3    2012-11-07   null          Chris T
 3    2011-10-02   null          James O

我想更新每个ID的seller_name,方法是将之前销售的buyer_name作为vendor_name添加到新的销售日期。例如,对于id 1,John B将成为2015-02-02中的卖方和2013-05-02中的买方。这有意义吗?

P.S。这是一个完美的案例,表格很大,而且ID不是那么整齐。

3 个答案:

答案 0 :(得分:4)

merge into your_table a 
using ( select rowid rid,
        lead(buyer_name, 1) over (partition by id order by date desc) seller
        from   your_table 
       ) b
       on (a.rowid = b.rid )
when matched then update set a.seller_name= b.seller;

说明:Merge into语句根据匹配或不匹配的标准执行不同的操作。在这里,您必须合并到您的表中,using中包含您要采用的新值以及将成为匹配键的rowid。 lead函数从接下来的n行获取结果,具体取决于您在逗号后指定的数字。在指定要跳转的行数后,您还要指定要使用的部分,在您的情况下,按id进行分区并按日期排序,这样您就可以获得卖家,即前任买家。希望这有点清除它。

答案 1 :(得分:1)

以下任一查询都可用于执行欲望操作

merge into sandeep24nov16_2 table1
using(select rowid r, lag(buyer_name) over (partition by id order by "DATE" asc) update_value from sandeep24nov16_2 ) table2
on (table1.rowid=table2.r)
when matched then update set table1.seller_name=table2.update_value;

merge into sandeep24nov16_2 table1
using(select rowid r, lead(buyer_name) over (partition by id order by "DATE" desc) update_value from sandeep24nov16_2 ) table2
on (table1.rowid=table2.r)
when matched then update set table1.seller_name=table2.update_value;

答案 2 :(得分:0)

select a.*,
       lag(buyer_name, 1) over(partition by id order by sale_date) seller_name
   from <your_table> a;