首页 > 解决方案 > 表内数据混杂

问题描述

我有一个场景,我必须用表中的数据屏蔽数据假设我有一个表student_details(ID, CODE, NAME)

1   A  XYZ
2   A  123
3   A  QWERTY

我希望输出为

1   A  QWERTY
2   A   XYZ
3   A   123

我希望该名称在该表中的名称列表中具有相同的 ID 我想要表中的不同名称。

select * from emp_details order by dbms_random.value; 正在给出一些不在列表中的随机名称。

谁能帮我这个?

标签: sqloracle

解决方案


如果您打算列表中的选定列并保持表的其余部分不变,则可以使用带有键排列表的连接。

假设您的数据如下:

        ID CODE NAME 
---------- ---- ------
      1001 A    XYZ    
      1002 B    123    
      1004 C    QUERTY 
      1005 A    FOO  

请注意,PK不是连续的,这是一般情况。如果您的 PK 是从 1 开始的连续序列,您甚至可以简化解决方案(如其他答案中所建议的那样)。

首先让我们定义排列表,以随机顺序分配给每个PK新键。

create table PERM as
with rn as (
select 
  id,
  row_number() over (order by id) rn,
  row_number() over (order by dbms_random.value) rn_new
from student)
select a.ID, b.ID ID_NEW 
from rn a
join rn b
on a.RN  = b.RN_NEW;

        ID     ID_NEW
---------- ----------
      1001       1004 
      1002       1001 
      1004       1005 
      1005       1002 

该查询定义了两个row_number序列,第一个按 的顺序排列PK,第二个按随机顺序排列。最后的连接得到原始的和新的(置换的)IDs。

现在排列选定的列就像将您的表连接两次一样简单,中间的列表并从第一个表中选择保留的列,从第二个表中选择排列的列。

select a.ID, a.code, b.name 
from student a
join PERM p on a.id = p.id
join student b on p.id_new = b.id
order by a.id;

        ID CODE NAME 
---------- ---- ------
      1001 A    QUERTY 
      1002 B    XYZ    
      1004 C    FOO    
      1005 A    123  

只要您保留排列表,您就可以重建以前的状态,如果您删除它,则无法获取原始数据。


推荐阅读