没啥意思的站点

oracle里循环搜索父子关系的键

想象一下,如果有一张oracle里的表,存着的是一个linux系统当前的进程信息,有ID、父ID、进程名之类的字段,如果给定一个进程ID,要查这个进程的所有父进程(包括爷爷进程等)的ID,sql改怎么写?这就要用到 CONNECT BY PRIOR … START WITH 子句了。
下面就是这样的一个例子:

--原先的表大致是这样的:
SELECT id, parentid FROM the_table WHERE id IN (14976, 14975);
        ID   PARENTID
---------- ----------
     14975      14657
     14975      14658
     14975      14992
     14975      15047
     14976      14975
--要查所有的父进程,这么干:
SELECT DISTINCT id FROM the_table CONNECT BY PRIOR parentid = id START WITH id = 14976;
        ID
----------
         1
       110
       127
       130
       155
       163
     12930
     13812
     14656
     14657
     14658
     14949
     14950
     14951
     14975
     14976
     14992
     15047

8 评论

  1. SQL Server 就只能写递归函数了…

  2. 这是板凳,是的,就是板凳:-)

  3. SELECT parentid FROM the_table WHERE id IN (SELECT id FROM the_table WHERE id = 14976 LIMIT 1);

    行不行呢?

  4. 父进程不是只有一个吗?怎么14975有那么多个爹?

  5. self join大家都有, 但这个确实方便….

发表评论