在表格中混杂数据

时间:2019-05-04 17:32:35

标签: sql oracle

我有一种情况,我必须用表中的数据屏蔽数据 假设我有一张桌子pip install tzlocal

student_details(ID, CODE, NAME)

我希望输出为

1   A  XYZ
2   A  123
3   A  QWERTY

我希望该名称位于该表的名称列表内 对于相同的ID,我想要表中的其他名称。

1 A QWERTY 2 A XYZ 3 A 123 给出了一些不在列表中的随机名称。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

这里是一个选择:使用ID分析函数重新计算ROW_NUMBER值,该函数按哈希值对连接的namecodeid列中的行进行排序(例如,您可以选择其他内容)。

SQL> with test (id, code, name) as
  2    (select 1, 'A', 'XYZ'    from dual union all
  3     select 2, 'A', '123'    from dual union all
  4     select 3, 'A', 'QUERTY' from dual
  5    ),
  6  inter as
  7    (select row_number() over (order by ora_hash(name || code || id)) id,
  8            code, name
  9     from test
 10    )
 11  select t.id, t.code, i.name
 12  from test t join inter i on t.id = i.id;

        ID C NAME
---------- - ------
         1 A XYZ
         2 A QUERTY
         3 A 123

SQL>

答案 1 :(得分:0)

如果您打算置换表中的所选列,并使表的其余部分保持不变,则可以对键置换表使用联接。

假设您的数据如下:

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

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

首先让我们定义排列表,以随机顺序为每个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的顺序,第二个以随机顺序。最后的联接将获得原始ID和新的(排列的)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

现在要进行置换选定的列很容易,因为两次表之间使用 permutation 进行联接,然后从中选择 preserved 列即可第一个表,第二个表的 permuted 列。

   >>> tab1
        Value       Sp_name    
    0   None        ROOT  
    1   0.066       Genus_1_sp1
    2   0.1044      Genus_2_sp1
    3   0.0708      EDGE  
    4   0.0586      Genus_3_sp1
    5   0.0083      Genus_4_sp1

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