1

我正在尝试更新表中的所有记录。当我阅读记录时,我需要使用集合中 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);
4

3 回答 3

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% 确定我的语法是否完全正确,但由于您没有提供任何测试数据,我会留下潜在的语法错误供您修复。

您还可以用rowid表的真正主键列替换使用。

于 2012-10-25T17:48:47.870 回答
0

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

于 2012-10-25T17:27:31.923 回答
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语句是获取子查询中的值的方式。

于 2012-10-25T17:52:16.790 回答