2010-06-17 8 views
1

내 DB를 ITEM_MASTER, PRICE_MASTER, COMP_MASTER오라클 조인 쿼리

ITEM_MASTER 
STORE_CODE ITEM_CODE ITEM_DESC 
    011   914004 desccc 

PRICE_MASTER 
STORE_CODE ITEM_CODE COMP_CODE 
    011   914004  01 
    011   914004  02 
    011   914004  03 
    011   914004  04 

COMP_MASTER 
COMP_CODE COMP_DESC STORE_CODE 
    01  comp1   011 
    02  comp2   011 
    03  comp3   011 
    04  comp4   011 

에서 세 개의 테이블이 나는 오라클을 쓸 수있는 방법은 단일 쿼리

STORE_CODE ITEM_CODE ITEM_DESC COMP_DESC1 COMP_DESC2 COMP_DESC3 COMP_DESC4 
    011  914004  desccc comp1  comp2  comp3  comp4 

의 ITEM_CODE에 대한 모든 이들을 싶어 있습니다 이것에 대한 SQL 쿼리 ??

답변

6

이 출력을 얻으려면 두 단계 (참여 및 피벗)가 필요합니다.

예 :

먼저 샘플 테이블을 생성 :

SQL> create table item_master (store_code,item_code,item_desc) 
    2 as 
    3 select '011', 914004, 'desccc' from dual 
    4/

Table created. 

SQL> create table price_master (store_code,item_code,comp_code) 
    2 as 
    3 select '011', 914004, '01' from dual union all 
    4 select '011', 914004, '02' from dual union all 
    5 select '011', 914004, '03' from dual union all 
    6 select '011', 914004, '04' from dual 
    7/

Table created. 

SQL> create table comp_master (comp_code,comp_desc,store_code) 
    2 as 
    3 select '01', 'comp1', '011' from dual union all 
    4 select '02', 'comp2', '011' from dual union all 
    5 select '03', 'comp3', '011' from dual union all 
    6 select '04', 'comp4', '011' from dual 
    7/

Table created. 

첫 번째 단계는 가입이다. 여기에서는 ANSI 조인 구문을 사용하지만 좋은 오라클 조인 구문도 사용할 수 있습니다.

SQL> select i.store_code 
    2  , i.item_code 
    3  , i.item_desc 
    4  , c.comp_desc 
    5 from item_master i 
    6   inner join price_master p 
    7   on ( i.store_code = p.store_code 
    8   and i.item_code = p.item_code 
    9   ) 
10   inner join comp_master c 
11   on ( p.store_code = c.store_code 
12   and p.comp_code = c.comp_code 
13   ) 
14/

STO ITEM_CODE ITEM_D COMP_ 
--- ---------- ------ ----- 
011  914004 desccc comp1 
011  914004 desccc comp2 
011  914004 desccc comp3 
011  914004 desccc comp4 

4 rows selected. 

비교 설명은 서로 아래에 있지만 서로 옆에 나타나기를 원합니다. 이를 달성하기 위해 결과 세트를 피벗합니다. 피봇 팅하려는 행 수를 하드 코딩해야합니다.

SQL> with t as 
    2 (select i.store_code 
    3   , i.item_code 
    4   , i.item_desc 
    5   , c.comp_desc 
    6   , row_number() over (partition by i.store_code,i.item_code order by c.comp_code) rn 
    7  from item_master i 
    8   inner join price_master p 
    9   on ( i.store_code = p.store_code 
10    and i.item_code = p.item_code 
11    ) 
12   inner join comp_master c 
13   on ( p.store_code = c.store_code 
14    and p.comp_code = c.comp_code 
15    ) 
16 ) 
17 select store_code 
18  , item_code 
19  , item_desc 
20  , max(decode(rn,1,comp_desc)) comp_desc1 
21  , max(decode(rn,2,comp_desc)) comp_desc2 
22  , max(decode(rn,3,comp_desc)) comp_desc3 
23  , max(decode(rn,4,comp_desc)) comp_desc4 
24 from t 
25 group by store_code 
26  , item_code 
27  , item_desc 
28/

STO ITEM_CODE ITEM_D COMP_ COMP_ COMP_ COMP_ 
--- ---------- ------ ----- ----- ----- ----- 
011  914004 desccc comp1 comp2 comp3 comp4 

1 row selected. 

희망 사항이 도움이 되었기를 바랍니다.

감사합니다. Rob.

+0

감사합니다 .... .... 내 하루를 .. .. – Andromeda

+0

+1 좋은 예제 코드. – DCookie