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

Ann*_*naB 4 sql oracle sql-update

我是 SQL 新手,不擅长更高级的查询和函数。

所以,我有一张销售表:

 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
Run Code Online (Sandbox Code Playgroud)

我想seller_name通过将buyer_name以前的销售作为卖家名称到较新的销售日期来更新每个 ID 。例如,对于 id 1,John B 将是卖家 in2015-02-02和买家 in 2013-05-02。那有意义吗?

PS 这是完美的案例,桌子很大,而且 id 的顺序不是那么整齐。

Mih*_*rna 5

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;
Run Code Online (Sandbox Code Playgroud)

说明:Merge into语句根据匹配或不匹配的条件执行不同的操作。在这里,您必须合并到您的表中,using其中包含要采用的新值以及将作为匹配键的 rowid。该lead函数根据您在逗号后指定的数字从接下来的 n 行中获取结果。在指定要跳转的行数后,您还可以指定要工作的部分,在您的情况下id,按日期进行分区和排序,以便您可以找到卖家,即之前的买家。希望这能让它变得清晰一点。