如何在Oracle中根据id_depto=id_manage条件生成指定格式查询结果?
Oracle 生成关联部门记录的解决方案
这个需求完全可以实现,核心思路是通过自关联查询生成需要的新记录,再用UNION ALL和原表数据合并,保留所有原有记录的同时添加新生成的记录。
原始数据表
| User_id | User | Department | id_depto | id_manage |
|---|---|---|---|---|
| 165 | Jhonson | Purchasing management | 900 | 900 |
| 356 | David | purchasing department R1 | 343 | 900 |
| 545 | Mary | purchasing department R2 | 326 | 900 |
| 825 | Alexander | Finance department | 925 | 800 |
需求说明
当用户满足id_depto = id_manage时,为该用户生成其id_manage组下所有id_depto对应的新记录,同时保留原表所有记录,得到目标结果。
实现SQL代码
-- 合并原有记录和新增记录 SELECT User_id, User, Department, id_depto, id_manage FROM your_table_name UNION ALL -- 生成符合条件的用户对应其管理组下所有部门的新记录 SELECT t1.User_id, t1.User, t1.Department, t2.id_depto, t1.id_manage FROM your_table_name t1 JOIN your_table_name t2 ON t1.id_manage = t2.id_manage WHERE t1.id_depto = t1.id_manage -- 排除已经存在的原始记录,避免重复 AND NOT (t1.id_depto = t2.id_depto);
逻辑解释
- 第一部分
SELECT ... FROM your_table_name直接获取原表所有记录,完整保留原始数据。 - 第二部分通过自关联实现新增记录生成:
- 用
t1筛选出id_depto = id_manage的用户(即部门管理者) - 关联
t2获取同一个id_manage组下的所有部门id_depto - 通过
AND NOT (t1.id_depto = t2.id_depto)排除已存在的原始记录,避免重复生成和原表一致的行
- 用
- 用
UNION ALL合并两部分结果,得到最终数据集。如果需要严格匹配示例中的排序顺序,可以在语句末尾添加ORDER BY User_id, id_depto。
执行后目标结果
| User_id | User | Department | id_depto | id_manage |
|---|---|---|---|---|
| 165 | Jhonson | Purchasing management | 900 | 900 |
| 165 | Jhonson | Purchasing management | 343 | 900 |
| 165 | Jhonson | Purchasing management | 326 | 900 |
| 356 | David | purchasing department R1 | 343 | 900 |
| 545 | Mary | purchasing department R2 | 326 | 900 |
| 825 | Alexander | Finance department | 925 | 800 |
内容的提问来源于stack exchange,提问作者Oscar Sandoval
相关产品推荐
相关产品推荐

