2013-03-15 107 views
0

我试图匿名客户表的“名称”字段。我想用下一条记录中的客户姓名替换每个记录的'姓名'。 (我知道:这不是真正的匿名,但'name'和'customerId'不匹配后,这就足够了我的目的)Oracle SQL - 使用下一条记录的内容更新数据库字段

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

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

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

+0

要做你正在尝试,你将不得不做自我加入。您还必须与表格中的最后一行进行抗衡。说了这么多,可能有更好的方法来实现你的目标。我无法想到我的头顶。 – 2013-03-15 17:26:15

回答

0

Mix'em all !!!

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; 
+0

嗨伊戈尔,这是一个很酷的声明。工作非常好。谢谢! – wildewutz 2013-03-15 18:27:52

+0

请注意,可能会有一小部分结果将名称分配给自己,如果它恰好落在相同的顺序中。 – 2013-03-16 16:01:31

1

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

我们也许可以制定出一个缺憾方式​​做到这一点,而是不能你刚才不是这样做:

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

在Oracle中,这将更新每一位客户提供10个字母数字的随机字符串数字。

-2

这可能会工作,但未经测试。

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

您需要使用LEAD()。

更正按照“a_horse_with_no_name的评论:铅(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 
/
+1

NVL并不是真的有必要。您可以为lead()函数提供一个“默认”值:'lead(ename,1,ename)' – 2013-03-15 17:36:03

+0

@a_horse_with_no_name - 谢谢。我错过了。 – Art 2013-03-15 17:39:04

相关问题