You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:38:19