oracle中每个名字和姓氏的唯一标识符

时间:2021-06-24 07:51:51

标签: oracle

我有如下表,名字和姓氏:

<头>
person1 person2
海伦菲舍尔 詹妮弗·洛佩兹
碧昂丝 詹妮弗·洛佩兹
詹妮弗·洛佩兹 碧昂丝

作为查询结果,我想为每个名字和姓氏获得唯一的 ID,如下所示:

<头>
person1 person2 uniqueId1 uniqueId2
海伦菲舍尔 詹妮弗·洛佩兹 A123 A124
碧昂丝 詹妮弗·洛佩兹 A125 A124
詹妮弗·洛佩兹 碧昂丝 A124 A125

如何为结果表准备“选择”脚本?提前致谢

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。一种是散列名称,例如:

select person1, person2,
  standard_hash(person1, 'MD5') as unique_id1,
  standard_hash(person2, 'MD5') as unique_id2
from your_table;
<头>
PERSON1 PERSON2 UNIQUE_ID1 UNIQUE_ID2
海伦菲舍尔 詹妮弗·洛佩兹 0x98E66FAC0FD3E55EC79F7538842067E6 0xE41C2D43B624E9237CE154512F47DE53
碧昂丝 詹妮弗·洛佩兹 0x3AE5DABEA04CBA4CE60FA41DFAF36EEC 0xE41C2D43B624E9237CE154512F47DE53
詹妮弗·洛佩兹 碧昂丝 0xE41C2D43B624E9237CE154512F47DE53 0x3AE5DABEA04CBA4CE60FA41DFAF36EEC

或者您可以获取所有唯一名称并为每个名称分配一个等级或 GUID:

select person, row_number() over (order by person), sys_guid()
from (
  select person1 as person
  from your_table
  union
  select person2
  from your_table
);

然后将其用作内联视图或 CTE 以加入:

with ids (person, id) as (
  select person, row_number() over (order by person)
  from (
    select person1 as person
    from your_table
    union
    select person2
    from your_table
  )
)
select person1, person2,
  ids1.id as unique_id1,
  ids2.id as unique_id2
from your_table
join ids ids1 on ids1.person = person1
join ids ids2 on ids2.person = person2;
<头>
PERSON1 PERSON2 UNIQUE_ID1 UNIQUE_ID2
海伦菲舍尔 詹妮弗·洛佩兹 2 3
碧昂丝 詹妮弗·洛佩兹 1 3
詹妮弗·洛佩兹 碧昂丝 3 1

db<>fiddle 与这些和一些小的变化。

更好的长期前景是拥有一个包含唯一名称和 ID 的单独表,并使该表中的值具有外键关系以确保数据完整性。

相关问题