我想把名字放在大桌子上。为此,我想不提这个名字。我该怎么做?
我尝试了以下方法
update (
select t.id, t.name, t.nr,
r.id, r.name, r.nr
from (select id, name, rownum nr from person) T
inner join (select id, name, rownum nr from (select id, name from person order by DBMS_RANDOM.VALUE)) R
on T.nr = R.nr
) set t.name = r.name;select部件工作正常,但更新部分不工作。
有什么想法吗?
发布于 2018-06-20 14:16:41
最后我找到了路
update person T
set name = (select rn.name
from (select id, name, rownum nr from person) ref
inner join (select id, name, rownum nr from (select id, name from person order by DBMS_RANDOM.VALUE)) rn
on ref.nr = rn.nr
where T.id=ref.id);但是,在大型表中存在性能问题。
下面是穆奇更好的表演版本
merge into person A
using (select rn.name from (select id, name, rownum nr from person) ref
inner join (select id, name, rownum nr from (select id, name from person order by DBMS_RANDOM.VALUE)) rn
on ref.nr = rn.nr) B
on A.id = B.id
when matched then
update set a.name = B.name;发布于 2018-04-22 05:41:48
如果您想将DBMS_RANDOM.VALUE与rownum结合使用,并且希望在原地更新If,则可以使用MERGE (Oracle12c):
设置
create table person
as
select 1 id, 'name1' name from dual union all
select 2 , 'name2' from dual union all
select 3 , 'name3' from dual union all
select 4 , 'name4' from dual union all
select 5 , 'name5' from dual ;
SQL> select * from person;
ID NAME
---------- -----
1 name1
2 name2
3 name3
4 name4
5 name5合并
merge into person P
using (
select id, name, rownum rn
from (
select id, name
from person
order by DBMS_RANDOM.VALUE )
) R on ( P.id = R.rn )
when matched then
update
set P.name = R.name
;
-- result
SQL> select * from person;
ID NAME
---------- -----
1 name3
2 name2
3 name4
4 name1
5 name5替代
看来你想把名字写成明文。如果是这样的话,您可以随机选择ID。在下面的示例中,使用了standard_hash()函数。
-- using the same PERSON table before ...
create table sha1
as
select
standard_hash( id ) as id
, name as name
from person ;
SQL> select * from sha1 order by id;
ID NAME
---------------------------------------- -----
1BBCAEE2AEA36F9E06501F5E7E85BF444D11A0C4 name4
B176DB7FBE17DDD94779DFAD1065D48D698082F1 name5
D0E90FA40F7B85F59C32F36D3FDB8BED9106DD14 name3
D961F70D39EE00CF78D4D476B80EF3AD5ABE128C name1
E39323970701D93598FC1D357F4BF04578CE3242 name2您也可以在这里使用dbms_random.value -而不是standard_hash()。但是,standard_hash()默认使用SHA1,它被设计为创建唯一的校验和(如果您的I是唯一的,则得到的SHA1散列应该是唯一的(批注:我知道发现了SHA1冲突)。
另外,您没有破坏原始表(如果需要,可以稍后删除它),而且代码比合并代码更容易理解。
https://stackoverflow.com/questions/49942431
复制相似问题