按特定顺序更新记录

时间:2012-10-25 17:12:28

标签: sql oracle

我正在尝试更新表格中的所有记录。当我读完记录时,我需要使用集合中NEXT记录的值更新当前记录中的列。问题是需要按指定的顺序进行更新。

我在考虑这样的事情......

Update t1
Set col1 = (select LEAD(col2,1) OVER (ORDER BY col3, col4, col5)
            from t1);

这不能编译,但是你看到我正在开车......有什么想法吗?

...更新

此peice确实成功运行,但只写入NULLS

Update t1 A
Set t1.col1 = (select LEAD(col2,1) OVER (ORDER BY col3, col4, col5)
           from t1 B
           where A.col3 = B.col3 AND
                 A.col4 = B.col4 AND
                 A.col5 = B.col5);

3 个答案:

答案 0 :(得分:1)

这应该这样做:

merge into t1
using
(
   select rowid as rid, 
          LEAD(col2,1) OVER (ORDER BY col3, col4, col5) as ld
   from t1
) lv on ( lv.rid = t1.rowid )
when matched then 
  update set col1 = lv.ld;

如果我的语法完全正确,并非100%确定,但由于您没有提供任何testdata,我将留下潜在的语法错误供您修复。

您还可以将rowid的使用情况替换为表中的实际主键列。

答案 1 :(得分:0)

为什么不使用光标?您可以在指定顺序的游标中使用更新。

答案 2 :(得分:0)

您可以使用with声明执行此操作:

with toupdate as (
    select t1.*,
           lead(col2, 1) over (order by col3, col4, col5) as nextval
    from t1
)
Update toupdate
    Set col1 = nextval

顺便说一句,这并不能保证更新的订购。但是,在分区子句中没有提到col2,因此它应该做正确的事情。

上述语法适用于SQL Server,但不适用于Oracle。原始问题未指定数据库(lead是SQL Server 2012中的有效函数)。似乎merge语句是获取子查询中值的方法。