首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >plsql -置换更新

plsql -置换更新
EN

Stack Overflow用户
提问于 2018-04-20 13:10:06
回答 2查看 77关注 0票数 1

我想把名字放在大桌子上。为此,我想不提这个名字。我该怎么做?

我尝试了以下方法

代码语言:javascript
复制
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部件工作正常,但更新部分不工作。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 14:16:41

最后我找到了路

代码语言:javascript
复制
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);

但是,在大型表中存在性能问题。

下面是穆奇更好的表演版本

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2018-04-22 05:41:48

如果您想将DBMS_RANDOM.VALUE与rownum结合使用,并且希望在原地更新If,则可以使用MERGE (Oracle12c):

设置

代码语言:javascript
复制
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

合并

代码语言:javascript
复制
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()函数。

代码语言:javascript
复制
-- 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冲突)。

另外,您没有破坏原始表(如果需要,可以稍后删除它),而且代码比合并代码更容易理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49942431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档