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

私はこのような何かを試してみましたが、私は、私はよくあなたの必要性を理解していれば、これは方法かもしれない

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

ですか? – Aleksej

+0

これはOracle用です。 – mesopotamia

答えて

1

「TABLE_B」を接続する方法を知りませんでした:

/* 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のすべてのデータを含む部分的な結果を作成し、この結果を単一の表であるかのように階層クエリで使用することです。

結果:それは、Oracle、MySQLやSQLServerのため

abc 
def 
ghi 
jkl 
prs 
tuv 
mno