我想用另一个表中的随机名称更新表中的名称。表 Users 中有真实的用户名。表 tmp_users 中有编造的名字。我想用 tmp_users 表中的随机名称更新用户表中的所有名称。这个想法是用假客户匿名真实生产数据。 tmp_users 表中的条目较少,所以我认为我无法与 id 相关联。

我遇到的问题是所有用户都设置为相同的名称。

一些示例数据:

create table users
(
  name varchar2(50)
);

create table tmp_users
(
  name varchar2(50)
);

insert into users values ('Cora');
insert into users values ('Rayna');
insert into users values ('Heidi');
insert into users values ('Gilda');
insert into users values ('Dorothy');
insert into users values ('Elena');
insert into users values ('Providencia');
insert into users values ('Louetta');
insert into users values ('Portia');
insert into users values ('Rodrick');
insert into users values ('Rocco');
insert into users values ('Nelson');
insert into users values ('Derrick');
insert into users values ('Everett');
insert into users values ('Nisha');
insert into users values ('Amy');
insert into users values ('Hyun');
insert into users values ('Brendon');
insert into users values ('Gabriela');
insert into users values ('Melina');

insert into tmp_users values ('Snow White');
insert into tmp_users values ('Cinderella');
insert into tmp_users values ('Aurora');
insert into tmp_users values ('Ariel');
insert into tmp_users values ('Belle');
insert into tmp_users values ('Jasmine');
insert into tmp_users values ('Pocahontas');
insert into tmp_users values ('Mulan');
insert into tmp_users values ('Tinker Bell');
insert into tmp_users values ('Anna');
insert into tmp_users values ('Elsa');

--Wrong, sets all users to the same random name
update users set name = (select name from (select name from tmp_users order by sys_guid()) where rownum = 1);

--Wrong, sets all users to the same random name
update users set name = (select name from (select name from tmp_users order by dbms_random.value) where rownum = 1);

这样做时:
select * from users;

我得到的结果是这样的,这是我不想要的。
Cinderella
Cinderella
Cinderella
Cinderella
Cinderella
...

我想为用户表中的每一行分配一个随机名称。所有行的名称不同。我想要这样的东西:
Mulan
Cinderella
Belle
Elsa
Jasmine
Tinker Bell
...

知道如何做到这一点吗?我使用的是 Oracle 数据库 11g 快捷版 11.2.0.2.0。使用游标很容易做到,但我试图弄清楚如何使用 set 操作来做到这一点。

更新:

我现在已经在两个不同的 Oracle 版本上进行了测试。相关子查询解决方案不适用于 Oracle Database 11g Express Edition 11.2.0.2.0。
但有时它确实适用于 Oracle Database 11g 企业版 11.2.0.4.0。在一张 table 上它一直有效,而在另一张 table 上却永远无效。

最佳答案

使用 11.2.0.4 测试以下工作,类似于@VR46 建议:

SQL> UPDATE users u
  2     SET name = (SELECT name
  3                   FROM (SELECT NAME,
  4                                row_number() over(ORDER BY dbms_random.value) rn
  5                           FROM tmp_users) tu
  6                    WHERE u.name IS NOT NULL
  7                         AND rn = 1);
20 rows updated

SQL> select * from users;
NAME
--------------------------------------------------
Ariel
Aurora
Belle
Ariel
Anna
Mulan
Aurora
Ariel
Mulan
Tinker Bell
Mulan
Ariel
Aurora
Pocahontas
Pocahontas
Aurora
Snow White
Mulan
Aurora
Anna
20 rows selected

关于sql - 用另一个表中的随机值替换值。甲骨文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35067415/

10-10 14:07