2017-02-22 66 views
1

我有一个包含数据是这样的分层查询

TABLE_A 

ID  PARENT_ID  NAME  PROJECT_ID 
1      abc  
2  1    def  
3  2    ghi 
4  3    jkl  101 
5  1    mno 

一个表,我有一个包含一些数据,取决于第一个表另一个表“PROJECT_ID”:

TABLE_B 
ID  PROJECT_ID NAME 
1  101   prs 
2  101   tuv 
3  102   xyz  
4  102   hgf 

我想要一个像这样的结果;

abc 
def 
ghi 
jkl 
prs 
tuv 
mno 

我已经试过这样的事情,但我不知道如何连接“表-B”

SELECT LEVEL, A.NAME 
FROM TABLE_A A 
CONNECT BY PRIOR A.ID = PRIOR A.PARENT_ID 
ORDER BY LEVEL; 
+0

是它的Oracle,MySQL或SQLServer的? – Aleksej

+0

这是Oracle的。 – mesopotamia

回答

1

如果我没有理解好你的需要,这可能是一个办法:

/* building a test case */ 
with TABLE_A(ID, PARENT_ID, NAME, PROJECT_ID) as (
    select 1,  null,   'abc',  null from dual union all 
    select 2,  1 ,   'def',  null from dual union all 
    select 3,  2 ,   'ghi',  null from dual union all 
    select 4,  3 ,   'jkl',  101 from dual union all 
    select 5,  1 ,   'mno',  null from dual 
),TABLE_B(ID, PROJECT_ID, NAME) as (
    select 1,  101,   'prs' from dual union all 
    select 2,  101,   'tuv' from dual union all 
    select 3,  102,   'xyz' from dual union all 
    select 4,  102,   'hgf' from dual 
) 
/* the query */ 
select name 
from (
     select ID, PARENT_ID, NAME, PROJECT_ID 
     from table_a 
     UNION ALL 
     select a.ID, a.PARENT_ID, b.NAME, a.PROJECT_ID 
     from table_b b 
       inner join table_a a 
       on a.project_id = b.project_id 
    ) 
start with parent_id is null 
connect by prior id = parent_id 

这里的想法是构建一个部分结果,其中包含来自table_atable_b的所有数据,然后将此结果用于分层查询,就好像它是单个表一样。

结果:

abc 
def 
ghi 
jkl 
prs 
tuv 
mno