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

すべてを混ぜる!!!

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 に答える
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
 )
 /

エネームと同じ:

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 に答える
-2

これは機能する可能性がありますが、テストされていません。

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