我正在尝试匿名化customer表的'name'字段。我想用下一条记录中客户的名字替换每条记录的“名称”。 (我知道:这不是真正的匿名,但'name'和'customerId'在那之后将无法匹配。这对我的目的来说已经足够了)
我尝试了这个,但是我收到了ORA-01747错误。
UPDATE Customer A
SET NAME =
(SELECT NAME
FROM Customer
WHERE ROWNUM = A.ROWNUM + 1)
有什么问题?如何使用表格中下一个“名称”字段的内容更新每个“名称”字段?
答案 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))