Oracle查询父子级 去除有子级的父级

文章介绍了如何使用SQL查询从结果集中过滤掉有子级的父级记录。通过NOTEXISTS子查询,结合两个相同的查询结果集,找到没有子级的记录。查询示例针对特定的数据库表结构,用于处理具有层级关系的数据。

    SELECT
        b.SRLXDM,
        b.FJ 
    FROM
        SRGL_SRXMB a
        JOIN SRGL_SRLXB b ON b.srlxdm = a.srly 
        where  a.ZGBM = '113400'               
    GROUP BY
        b.SRLXDM,
        b.FJ
    ORDER BY
         b.SRLXDM

查询结果,如图

可以看到SRLXDM003是有子级的,需求是去掉有子级的父级

例子:

SELECT
    * 
FROM
    table1 t1 
WHERE
    NOT EXISTS ( SELECT 1 FROM table1 t2 WHERE t2.parent_id = t1.id );

    table1会查出所有的父子级关系的结果集,子查询中是找出有子级的的父级,NOT EXISTS将t1中有子级的父级进行过滤

修改后:

SELECT * FROM
    (SELECT
        b.SRLXDM,
        b.FJ 
    FROM
        SRGL_SRXMB a
        JOIN SRGL_SRLXB b ON b.srlxdm = a.srly 
        where  a.ZGBM = '113400'               
    GROUP BY
        b.SRLXDM,
        b.FJ ) t1
WHERE 
    NOT EXISTS(SELECT * FROM (SELECT
        b.SRLXDM,
        b.FJ 
    FROM
        SRGL_SRXMB a
        JOIN SRGL_SRLXB b ON b.srlxdm = a.srly 
        where  a.ZGBM = '113400'               
    GROUP BY
        b.SRLXDM,
        b.FJ ) t2 where t2.FJ = t1.SRLXDM )
ORDER BY
    SRLXDM

查询结果:

### Oracle 数据库中的分层查询方法 在 Oracle 数据库中,可以通过 `CONNECT BY` 句来实现分层数据的查询。这种句允许用户沿着父子关系遍历树状结构的数据表。为了查询所有的节点,在 SQL 查询语句中可以利用 `PRIOR` 关键字指定当前行与其行之间的关系。 以下是用于查询所有节点的一个典型语法: ```sql SELECT column_name, LEVEL FROM table_name START WITH condition_for_root_node CONNECT BY PRIOR child_column = parent_column; ``` 在这个上下文中: - `column_name`: 表示要检索的具体列名。 - `table_name`: 是存储层次化数据的目标表格名称。 - `condition_for_root_node`: 定义根节点的选择条件[^1]。 - `child_column` 和 `parent_column`: 这两个字段分别表示节点和其对应的节点的关系[^2]。 当执行上述类型的查询时,Oracle 处理这些请求的方式是通过递归地追踪每一层上的记录直到达到最顶层或者满足特定终止条件为止。 如果需要修改数据库内的分层数据,则有两种主要方式可供考虑:即时更新或是延迟更新(Deferred Database Modification)。后者意味着更改操作会被暂存起来,并在一个事务结束之前不会真正应用到实际数据上[^3]。然而这并不直接影响标准 SELECT 操作的行为模式。 下面是一个具体的例展示如何获取某个员工及其上领导链的信息: ```sql SELECT employee_id, manager_id, last_name, LEVEL FROM employees START WITH employee_id = 101 -- 假设这是我们要追溯的第一个雇员ID CONNECT BY PRIOR manager_id = employee_id; ``` 此脚本会返回从给定起始点出发向上至最高管理层的所有关联人员列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值