0

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

我试过这个,但我得到一个 ORA-01747 错误。

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

怎么了?如何使用表中下一个“名称”字段的内容更新每个“名称”字段?

4

4 回答 4

1

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

我们可能会想出一个笨拙的方法来做到这一点,但相反,你不能做一些类似的事情:

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

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

于 2013-03-15T17:23:47.300 回答
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
/
于 2013-03-15T17:27:29.027 回答
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;
于 2013-03-15T17:52:29.977 回答
-2

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

UPDATE Customer A
   SET NAME =
          (SELECT NAME
             FROM Customer 
            WHERE ROWNUM = (SELECT (A.ROWNUM + 1))
于 2013-03-15T17:24:41.450 回答