2017-02-22 80 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