2013-03-15 43 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

相關問題