如何从Oracle中选择所有记录,Child作为Parent,直到没有子记录为父项?

时间:2015-07-22 06:25:01

标签: sql oracle

可能是我的标题描述不清楚:-)但是,下面是示例。

我有两张桌子,

表1:

SNO   PARENTID   
1      P01
2      P02
3      P03
4      P04

表2:

SNO   CHILDID   PARENTID
1      C01        P01
2      C02        P01
3      C03        P03
4      P03        P01
5      P04        P01
6      A01        P03
7      A02        P04

因此,每个ParentId都有多个子项,如

select childid from table2 where parentid = 'P01';

我会得到C01,C02,P03 AND P04。这是正常的,

但在我的情况下,我想再次使用childids检查这些table1(parent table),如果存在,那么我还需要childids parentids。它将一直持续到我的childid与我的parentid不匹配。

Ex Cont .. 在我的输出上面包含P03和P04,所以我需要带孩子C03,A01和A02 ...

我需要查询,帮助我们。

先谢谢, Stephen.L

2 个答案:

答案 0 :(得分:1)

我不太清楚你想如何布局结果集,但你应该使用Oracle的分层查询语法:

$company->getCompanyName()

这里我忽略了T1,因为T2具有创建层次结构所需的信息。您可以在查询中加入T1,但您的问题并不清楚它扮演的角色。通过不加入它我们失去了P02的条目。但是,与T1连接将为P03和P04生成多行。

SQL> select t2.parentid
  2         , lpad(' ', (level-1)*2)||t2.childid as childid
  3         , level
  4  from t2 
  5  connect by prior t2.childid = t2.parentid
  6  start with t2.parentid = 'P01'
  7  /

PARE CHILDID         LEVEL
---- ---------- ----------
P01  C01                 1
P01  C02                 1
P01  P03                 1
P03    A01               2
P03    C03               2
P01  P04                 1
P04    A02               2

7 rows selected.

SQL> 

Oracle为SQL提供了一些非常巧妙的扩展,可以处理分层数据。他们肯定是在探索。 Find out more

答案 1 :(得分:0)

你可以试试这个:

select CHILDID from tbl2 t2 
join tbl1 t1 on t2.PARENTID = t1.PARENTID
START WITH t2.parentid = 'P01'
CONNECT BY NOCYCLE PRIOR CHILDID = t2.parentid;

如果CHILDIDtbl2检索到的tbl1children中不存在,那么它将不会搜索其{{1}}

此处使用Oracle分层查询进行更多信息检查link