java - 带有自定义分组列的 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 中是否有任何函数可以在数据库端本身处理这种行为。
解决方案
尝试这个:
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;
推荐阅读
- module - Scrapy:没有名为“scrapy.contrib”的模块
- javascript - Javascript 在 10 秒后运行
- python - 将元组中的列名传递给 Pandas
- react-native - 无法识别的字体系列“材料图标”
- php - 如何将 !isset($_SESSION['user_login']) 更改为 laravel?
- c++ - 访问冲突新的 C++ 结构
- angular - i18n 国际化如何为多语言服务或构建
- c# - 在 C# 中迭代 ArrayList 时,var 类型如何在运行时决定数据类型
- python - 在pyglet中滚动背景图像
- ios - 定时器更新标签比第二个定时器倒计时晚 1 秒