FULL OUTER JOIN할 때 질문입니다 0 10 5,418

by hj [SQL Query] JOIN FULL OUTER JOIN [2014.04.21 13:35:40]


TABLE_1       TABLE_2      
과목 과목명 학점 성적 과목 과목명 학점 비고
PR001 TOEIC1 1 B+ PR001 TOEIC1 1  
PR002 TOEIC2 1 A PR002 TOEIC2 1  
PR006 채플 1 B+ PR003 정보학 2  
        PR007 정보학2 3  

 

테이블 조인을 할 때 데이터가 중복되는 것도 있고 중복되지 않는 것도 있는데

FULL OUTER JOIN을 하게되면 한쪽에 데이터가 없는 경우 공백으로 나타나는데

위와같이 공백이 생기지 않고 모든 데이터를 보여주면서 순서대로 정렬할 수 있도록 하는 방법이 있을까요?ㅠㅠ

 

by 농부지기 [2014.04.21 13:40:55]
SELECT DECODE(T1.과목코드   , NULL, T2.과목코드  , T1.과목코드  )   AS 과목코드
     , DECODE(T1.과목명     , NULL, T2.과목명    , T1.과목명    )   AS 과목명
     , DECODE(T1.학점       , NULL, T2.학점      , T1.학점      )   AS 학점
     , T1.성적
     , T2.비고
  FROM T1 FULL JOIN T2
        ON (    T1.과목코드 = T2.과목코드);

 


by hj [2014.04.21 13:48:54]

답변 감사합니다~

근데 단순히 FULL JOIN을 하는게 아니라

데이터 결과가 위에 보이는 것처럼

TABLE1의 컬럼, TABLE2의 컬럼이 양쪽으로 나열되어야 합니다..

혹시 다른 방법이 있을까요? ㅠㅠ


by 농부지기 [2014.04.21 13:57:17]

위 SQL 문장에서 DECOE처럼 활용하시면

쉽게 될거 같은데요.

위 방법이 아니라면,  실제테이블값과 결과 LAYOUT값을 정확하게

다시 올려주시면  봐 드릴게요.


by 웅 [2014.04.21 14:09:05]

위 테이블을 full outer join하신 후
기준이 되는 코드테이블과 outer 조인하세요


by hj [2014.04.21 14:12:24]
SELECT D1.SUB AS SUB1
     , D1.SUB_NM AS SUB_NM1
     , D1.CDT AS CDT1
     , D2.SUB AS SUB2
     , D2.SUB_NM AS SUB_NM2
     , D2.CDT AS CDT2
FROM
    ( SELECT 'A001' AS SUB, '교양1' AS SUB_NM, 1 AS CDT FROM DUAL
      UNION
      SELECT 'A002' AS SUB, '교양2' AS SUB_NM, 1 AS CDT FROM DUAL
    ) D1
   FULL OUTER JOIN
   ( SELECT 'A002' AS SUB, '교양2' AS SUB_NM, 1 AS CDT FROM DUAL
      UNION
     SELECT 'B001' AS SUB, '전공1' AS SUB_NM, 2 AS CDT FROM DUAL
      UNION
     SELECT 'B002' AS SUB, '전공2' AS SUB_NM, 3 AS CDT FROM DUAL
    ) D2
ON D1.SUB = D2.SUB
SUB1 SUB_NM1 CDT1 SUB2 SUB_NM2 CDT2
A002 교양2 1 A002 교양2 1
      B002 전공2 3
      B001 전공1 2
A001 교양1 1      

이런 데이터 구조라고 봤을 때

중복된 것은 그대로 보여지고 겹치지 않는 값들은 공백으로 하나씩 나오는게 아니라

아래처럼 그냥 순서대로 쭉 나열해주고 싶습니다..

SUB1 SUB_NM1 CDT1 SUB2 SUB_NM2 CDT2
A002 교양2 1 A002 교양2 1
A001 교양1 1 B001 전공1 2
      B002 전공2 3

by 웅 [2014.04.21 15:12:20]

보통 조인이란 데이터간 상관이 relation이 있어야 되는데 그럴 필요가 없는 요구네요.

with D1_s as
    ( SELECT 'A001' AS SUB, '교양1' AS SUB_NM, 1 AS CDT FROM DUAL
      UNION
      SELECT 'A002' AS SUB, '교양2' AS SUB_NM, 1 AS CDT FROM DUAL
    ) 
    ,D2_s as
    (SELECT 'A002' AS SUB, '교양2' AS SUB_NM, 1 AS CDT FROM DUAL
      UNION
     SELECT 'B001' AS SUB, '전공1' AS SUB_NM, 2 AS CDT FROM DUAL
      UNION
     SELECT 'B002' AS SUB, '전공2' AS SUB_NM, 3 AS CDT FROM DUAL
    ) 
, d1 as (select d1_s.*, rownum rn from d1_s )   
, d2 as (select d2_s.*, rownum rn from d2_s )
SELECT D1.SUB AS SUB1
     , D1.SUB_NM AS SUB_NM1
     , D1.CDT AS CDT1
     , D2.SUB AS SUB2
     , D2.SUB_NM AS SUB_NM2
     , D2.CDT AS CDT2
FROM  d1
 FULL OUTER JOIN
     d2
ON D1.rn = D2.rn

 


by 마농 [2014.04.21 15:32:24]

a002 가 같은 줄에 나와야 하니 조인이 필요하긴 하네요.


by 웅 [2014.04.21 15:44:36]

난독증인가봐용 ㅋㅋ


by 마농 [2014.04.21 15:32:57]
WITH d1 AS
(
SELECT 'A001' sub, '교양1' sub_nm, 1 cdt FROM dual
UNION ALL SELECT 'A002', '교양2', 1 FROM dual
)
, d2 AS
(
SELECT 'A002' sub, '교양2' sub_nm, 1 cdt FROM dual
UNION ALL SELECT 'B001', '전공1', 2 FROM dual
UNION ALL SELECT 'B002', '전공2', 3 FROM dual
)
SELECT MIN(sub1) sub1
     , MIN(sub_nm1) sub_nm1
     , MIN(cdt1) cdt1
     , MIN(sub2) sub2
     , MIN(sub_nm2) sub_nm2
     , MIN(cdt2) cdt2
  FROM (SELECT d1.sub sub1, d1.sub_nm sub_nm1, d1.cdt cdt1
             , d2.sub sub2, d2.sub_nm sub_nm2, d2.cdt cdt2
             , DECODE(d1.sub, d2.sub, 1, 2) gb1
             , DENSE_RANK() OVER(
               PARTITION BY DECODE(d1.sub, d2.sub, 1, null, 2, 3)
               ORDER BY NVL(d1.sub, d2.sub)
               ) gb2
          FROM d1
          FULL OUTER JOIN d2
            ON d1.sub = d2.sub
        )
 GROUP BY gb1, gb2
 ORDER BY gb1, gb2
;

 


by hj [2014.04.21 16:01:21]

도움주신 분들 너무 감사합니다~

그룹을 어떤 조합으로 걸어야할지 몰랐는데 많이 배우고 갑니다

더 열심히 해야겠네요ㅠㅠ

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입