【问题标题】:Oracle Identity column with custom grouping column带有自定义分组列的 Oracle 标识列
【发布时间】:2021-07-14 13:19:36
【问题描述】:

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

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 EMPLOYEE_ID MANAGER_ID FIRST_NAME
radmon1 finance employee1 John B
radmon2 finance employee2 employee1 Michal
radmon3 finance employee3 employee1 Ronaldo
radmon4 finance employee4 employee1 Thomas
radmon5 finance employee5 Percey
radmon6 account employee6 Stacy
radmon7 account employee7 Jordan
radmon8 account employee8 employee6 Micky
radmon9 account employee9 employee6 Author
radmon10 account employee10 employee6 Gordan

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

ALTER TABLE TEST_ORGANIZATION ADD SEQUENCE_ID NUMBER

UUID DEPARTMENT_ID EMPLOYEE_ID MANAGER_ID FIRST_NAME SEQUENCE_ID
radmon1 finance employee1 John B 1
radmon2 finance employee2 employee1 Michal
radmon3 finance employee3 employee1 Ronaldo
radmon4 finance employee4 employee1 Thomas
radmon5 finance employee5 Percey 2
radmon6 account employee6 Stacy 1
radmon7 account employee7 Jordan 2
radmon8 account employee8 employee6 Micky
radmon9 account employee9 employee6 Author
radmon10 account employee10 employee6 Gordan

我尝试使用在 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 中是否有任何函数可以在数据库端本身处理这种行为。

【问题讨论】:

  • 这个 sequence_id 列的目的是什么?它是约束的一部分,还是出于显示目的?您始终可以向表中添加一个虚拟列,通过分析函数即时生成值,但这不是永久值,每次查询该列时都会计算它。
  • 在经理行的行上要有一个唯一的标识符,在每个部门都是唯一的。

标签: java oracle max identity-column oracle19c


【解决方案1】:

试试这个:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多