Oracle数据库:为COURSE与STUDENT唯一组合生成GUID替代DENSE_RANK
Oracle SQL生成唯一GUID方案(按COURSE+STUDENT组合)
针对需求——为每个COURSE和STUDENT的唯一组合生成全局唯一的GUID,这里提供两种实用方案:
方案一:分组子查询生成GUID(推荐,性能更优)
通过分组子查询先为每个COURSE+STUDENT组合生成唯一GUID,再关联回原表,确保同一组合的所有行共用同一个GUID:
SELECT crd.COURSE, crd.SUBJECT, crd.STUDENT, -- 转换为带分隔符的标准GUID字符串格式 REGEXP_REPLACE(RAWTOHEX(g.GROUP_GUID), '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})', '\1-\2-\3-\4-\5') AS GROUP_GUID FROM COURSE_REGISTRATION_DETAILS crd JOIN ( SELECT COURSE, STUDENT, SYS_GUID() AS GROUP_GUID -- Oracle原生全局唯一GUID生成函数 FROM COURSE_REGISTRATION_DETAILS GROUP BY COURSE, STUDENT ) g ON crd.COURSE = g.COURSE AND crd.STUDENT = g.STUDENT;
方案二:窗口函数简化写法
利用窗口函数FIRST_VALUE,在COURSE+STUDENT分组内取同一个GUID,无需关联子查询:
SELECT COURSE, SUBJECT, STUDENT, REGEXP_REPLACE(RAWTOHEX(FIRST_VALUE(SYS_GUID()) OVER (PARTITION BY COURSE, STUDENT ORDER BY NULL)), '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})', '\1-\2-\3-\4-\5') AS GROUP_GUID FROM COURSE_REGISTRATION_DETAILS;
关键说明
SYS_GUID()是Oracle内置函数,生成的16字节RAW值是全局唯一的,彻底解决DENSE_RANK()仅生成整数排名的局限性。RAWTOHEX()将RAW类型转换为十六进制字符串,REGEXP_REPLACE用于添加分隔符,得到符合通用规范的GUID格式。- 方案一适合大数据量场景,仅需一次分组生成GUID;方案二写法更简洁,适合数据量较小的表。
内容的提问来源于stack exchange,提问作者Tech de Enigma
相关产品推荐
相关产品推荐

