Oracle SQL - 使用下一条记录的内容更新数据库字段

时间:2013-03-15 17:16:20

标签: sql oracle rownum

我正在尝试匿名化customer表的'name'字段。我想用下一条记录中客户的名字替换每条记录的“名称”。 (我知道:这不是真正的匿名,但'name'和'customerId'在那之后将无法匹配。这对我的目的来说已经足够了)

我尝试了这个,但是我收到了ORA-01747错误。

UPDATE Customer A
   SET NAME =
          (SELECT NAME
             FROM Customer 
            WHERE ROWNUM = A.ROWNUM + 1)

有什么问题?如何使用表格中下一个“名称”字段的内容更新每个“名称”字段?

4 个答案:

答案 0 :(得分:1)

ROWNUM是一个伪列,它不与数据一起存储,它是结果集的一部分。另外,通常关系数据库没有行顺序的概念。

我们可能会采用一种愚蠢的方式来做这件事,但相反,你不能只做以下的事情:

UPDATE CUSTOMER SET NAME = DBMS_RANDOM.STRING('a', 10);

在Oracle中,它使用10个字母数字的随机字符串更新每个客户。

答案 1 :(得分:0)

您需要使用LEAD()。

根据'a_horse_with_no_name'评论进行更正:LEAD(sal,1,sal)

UPDATE emp_test a 
   SET sal = 
 (
  SELECT LEAD(sal, 1, sal) OVER (ORDER BY sal) AS sal_next
    FROM scott.emp b
   WHERE a.empno = b.empno
 )
 /

与ename相同:

SELECT empno, ename, job, sal,
       LEAD(ename, 1, ename) OVER (ORDER BY ename) AS name_next
  FROM scott.emp
 /

 EMPNO    ENAME    JOB        SAL    NAME_NEXT
 --------------------------------------------
 7876    ADAMS    CLERK       1100    ALLEN
 7499    ALLEN    SALESMAN    1600    BLAKE
 7698    BLAKE    MANAGER     2850    CLARK
 7782    CLARK    MANAGER     2450    FORD
 ....
 7844    TURNER   SALESMAN    1500    WARD
 7521    WARD     SALESMAN    1250    WARD

这不起作用:

SELECT * FROM scott.emp
  WHERE ROWNUM = 5
/

但这会:

SELECT * FROM scott.emp
 WHERE ROWNUM <= 5
/

答案 2 :(得分:0)

混合所有!!!

merge into Customer dest
using (
   select r, name from
   (select name, row_number() over (order by dbms_random.value) n from Customer)
   join (select rowid r, rownum n from Customer) using(n) 
) src
on (dest.rowid = src.r)
when matched then update set
   dest.name = src.name;

答案 3 :(得分:-2)

这可能有效,但尚未经过测试。

UPDATE Customer A
   SET NAME =
          (SELECT NAME
             FROM Customer 
            WHERE ROWNUM = (SELECT (A.ROWNUM + 1))