sql - 表内数据混杂
问题描述
我有一个场景,我必须用表中的数据屏蔽数据假设我有一个表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;
正在给出一些不在列表中的随机名称。
谁能帮我这个?
解决方案
如果您打算排列表中的选定列并保持表的其余部分不变,则可以使用带有键排列表的连接。
假设您的数据如下:
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
,第二个按随机顺序排列。最后的连接得到原始的和新的(置换的)ID
s。
现在排列选定的列就像将您的表连接两次一样简单,中间的排列表并从第一个表中选择保留的列,从第二个表中选择排列的列。
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
只要您保留排列表,您就可以重建以前的状态,如果您删除它,则无法获取原始数据。
推荐阅读
- javascript - SameSite Cookie 属性警告未得到修复
- amazon-web-services - ECS 任务未启动 - 已停止(CannotPullContainerError:“来自守护程序请求的错误响应在等待连接时取消”
- ios - AWSCognitoIdentityMultiFactorAuthentication 永不返回
- java - ThreadGroup.activeCount() 方法在 java 中不起作用
- javascript - 如何用javascript分割多个字符
- java - 如何从只读基类覆盖 JSON 字段并改用子字段?
- oracle - 查询多值列
- java - 如何使用 LiveData 更新 RecyclerView 示例:SeenCounter、CommentCounter、LikeCounter
- xamarin.forms - 如何在 Syncfusion 的 TreeView 上触发点击事件
- amazon-web-services - 在 AWS ECS 上的蓝/绿部署期间获得不正常的响应