首页 > 解决方案 > 带有自定义分组列的 Oracle 标识列

问题描述

我正在处理一个要求,我需要在作为经理行且在每个部门中唯一的行上填充唯一的 常量标识符。我的表结构是

CREATE
  TABLE TEST_ORGANIZATION
  (
    EMPLOYEE_ID   NUMBER NOT NULL,
    MANAGER_ID    NUMBER,
    FIRST_NAME    VARCHAR2(256),
    DEPARTMENT_ID VARCHAR2(28) NOT NULL,
    UUID          VARCHAR2(28) ,
    PRIMARY KEY(UUID)
  );

此表包含的信息为。

UUID DEPARTMENT_ID 员工ID MANAGER_ID
拉德蒙1 金融 员工1 约翰·B
拉德蒙2 金融 员工2 员工1 迈克尔
拉德蒙3 金融 员工3 员工1 罗纳尔多
拉德蒙4 金融 员工4 员工1 托马斯
拉德蒙5 金融 员工5 珀西
拉德蒙6 帐户 员工6 史黛西
拉德蒙7 帐户 员工7 约旦
拉德蒙8 帐户 员工8 员工6 米奇
拉德蒙9 帐户 员工9 员工6 作者
拉德蒙10 帐户 员工10 员工6 戈尔丹

我想在表格中添加另一列,以便仅向经理提供序列 ( where Manager_ID is null)。但是,该序列应与DEPARTMENT_ID

ALTER TABLE TEST_ORGANIZATION ADD SEQUENCE_ID NUMBER

UUID DEPARTMENT_ID 员工ID MANAGER_ID SEQUENCE_ID
拉德蒙1 金融 员工1 约翰·B 1
拉德蒙2 金融 员工2 员工1 迈克尔
拉德蒙3 金融 员工3 员工1 罗纳尔多
拉德蒙4 金融 员工4 员工1 托马斯
拉德蒙5 金融 员工5 珀西 2
拉德蒙6 帐户 员工6 史黛西 1
拉德蒙7 帐户 员工7 约旦 2
拉德蒙8 帐户 员工8 员工6 米奇
拉德蒙9 帐户 员工9 员工6 作者
拉德蒙10 帐户 员工10 员工6 戈尔丹

我尝试使用在 oracle 12/19c 之后添加的序列和标识列。

我可以从后端服务以编程方式SEQUENCE_ID使用
Select NVL(MAX(SEQUENCE_ID), 0) + 1 FROM TEST_ORGANIZATION WHERE MANAGER_ID is NULL AND DEPARTMENT_ID = ? 查询进行更新。但是,我想知道 Oracle 19c 中是否有任何函数可以在数据库端本身处理这种行为。

标签: javaoraclemaxidentity-columnoracle19c

解决方案


尝试这个:

SELECT d1.*,
       1 AS f,
       CASE WHEN manager_id is null then
          RANK() OVER (partition by department_ID order by manager_id nulls first,employee_id)
       end as sequenc
FROM   (
         SELECT 'radmon1' AS UUID,'finance' AS DEPARTMENT_ID,'employee1' AS EMPLOYEE_ID,'' AS MANAGER_ID,'John B' AS    FIRST_NAME          from dual UNION ALL
         SELECT 'radmon2','finance','employee2','employee1','Michal'     from dual UNION ALL
         SELECT 'radmon3','finance','employee3','employee1','Ronaldo'    from dual UNION ALL
         SELECT 'radmon4','finance','employee4','employee1','Thomas'     from dual UNION ALL
         SELECT 'radmon5','finance','employee5','','Percey'         from dual UNION ALL
         SELECT 'radmon6','account','employee6','','Stacy'              from dual UNION ALL
         SELECT 'radmon7','account','employee7','','Jordan'            from dual UNION ALL
         SELECT 'radmon8','account','employee8','employee6','Micky'      from dual UNION ALL
         SELECT 'radmon9','account','employee9','employee6','Author'     from dual UNION ALL
         SELECT 'radmon10','account','employee10','employee6','Gordan'   from dual
       )d1;

推荐阅读