我有如下表,名字和姓氏:
person1 | person2 |
---|---|
海伦菲舍尔 | 詹妮弗·洛佩兹 |
碧昂丝 | 詹妮弗·洛佩兹 |
詹妮弗·洛佩兹 | 碧昂丝 |
作为查询结果,我想为每个名字和姓氏获得唯一的 ID,如下所示:
person1 | person2 | uniqueId1 | uniqueId2 |
---|---|---|---|
海伦菲舍尔 | 詹妮弗·洛佩兹 | A123 | A124 |
碧昂丝 | 詹妮弗·洛佩兹 | A125 | A124 |
詹妮弗·洛佩兹 | 碧昂丝 | A124 | A125 |
如何为结果表准备“选择”脚本?提前致谢
答案 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 的单独表,并使该表中的值具有外键关系以确保数据完整性。