오라클 쿼리 질문드립니다 0 4 971

by 하수개발자 [2015.04.07 10:01:49]


구분 예정 실시
항구은행 항구 예정1 항구 실시1
항구은행 항구 예정2 항구 실시2
항구은행   항구 실시3
농촌은행 농촌 예정1 농촌 실시1
농촌은행 농촌 예정2  

테이블은 3개이고요

A : 구분값 저장 테이블

B : 예정테이블

C : 실시 테이블

A -> B 연결고리는 A키값 인 seq -> wf_seq

A -> C 연결고리는 A키값 인 seq -> wf_seq

이 구조 일 때 쿼리로 표현이 가능한가요?

해당 구분값에 값이 없으면 그림에서 처럼 null로 보이고 싶습니다

 

고수님들 부탁드려요 ㅜ

 

 

by 창조의날개 [2015.04.07 10:52:06]

WITH A AS(
  SELECT 1 SEQ, '항구은행' NM FROM DUAL UNION ALL
  SELECT 2 SEQ, '농촌은행' NM FROM DUAL
)
, B AS(
  SELECT 1 SEQ, 1 B_SEQ, '항구예정1' NM FROM DUAL UNION ALL
  SELECT 1 SEQ, 2 B_SEQ, '항구예정2' FROM DUAL UNION ALL
  SELECT 2 SEQ, 3 B_SEQ, '농촌예정1' FROM DUAL UNION ALL
  SELECT 2 SEQ, 4 B_SEQ, '농촌예정2' FROM DUAL
)
, C AS(
  SELECT 1 SEQ, 1 B_SEQ, 1 C_SEQ, '항구실시1' NM FROM DUAL UNION ALL
  SELECT 1 SEQ, 2 B_SEQ, 2 C_SEQ, '항구실시2' FROM DUAL UNION ALL
  SELECT 1 SEQ, NULL B_SEQ, 3 C_SEQ, '항구실시3' FROM DUAL UNION ALL
  SELECT 2 SEQ, 3 B_SEQ, 4 C_SEQ, '농촌실시1' FROM DUAL
)
SELECT BB.NM "구분", NM1 "예정", NM2 "실시"
FROM (
      SELECT B.SEQ SEQ1, B.NM NM1, C.SEQ SEQ2, C.NM NM2
      FROM B, C
      WHERE B.SEQ(+) = C.SEQ
        AND B.B_SEQ(+) = C.B_SEQ
      UNION
      SELECT B.SEQ SEQ1, B.NM NM1, C.SEQ SEQ2, C.NM NM2
      FROM B, C
      WHERE B.SEQ = C.SEQ(+)
        AND B.B_SEQ = C.B_SEQ(+)
    ) AA
    , A BB
WHERE NVL(AA.SEQ1,AA.SEQ2) = BB.SEQ
ORDER BY BB.SEQ,NM1,NM2
;

 


by 쿼리back [2015.04.07 11:11:11]
-- 창조날개님 with 좀 빌려 썻습니다. ^^

select a.nm,t.bnm , t.cnm
from (select nvl(b.seq,c.seq) seq , b.nm bnm , c.nm cnm 
from c full outer join b 
on b.B_SEQ = c.B_SEQ) t , a
where a.seq = t.seq
order by a.nm desc , bnm

 


by 개발뉴비 [2015.04.07 11:29:58]
WITH T1 (SEQ, BANK) AS (
    SELECT 1, '항구은행' FROM DUAL UNION ALL
    SELECT 2, '농촌은행' FROM DUAL  
), T2 (WF_SEQ, PLAN) AS (
    SELECT 1, '항구 예정1' FROM DUAL UNION ALL
    SELECT 1, '항구 예정2' FROM DUAL UNION ALL
    SELECT 2, '농촌 예정1' FROM DUAL UNION ALL
    SELECT 2, '농촌 예정2' FROM DUAL
), T3 (WF_SEQ, EXEC) AS (
    SELECT 1, '항구 실시1' FROM DUAL UNION ALL
    SELECT 1, '항구 실시2' FROM DUAL UNION ALL
    SELECT 1, '항구 실시3' FROM DUAL UNION ALL
    SELECT 2, '농촌 실시1' FROM DUAL
), TT2 (WF_SEQ, LVL, TXT) AS (
    SELECT WF_SEQ
         , ROW_NUMBER() OVER (PARTITION BY WF_SEQ ORDER BY WF_SEQ) LVL
         , PLAN
      FROM T2  
), TT3 (WF_SEQ, LVL, TXT) AS (
    SELECT WF_SEQ
         , ROW_NUMBER() OVER (PARTITION BY WF_SEQ ORDER BY WF_SEQ) LVL
         , EXEC
      FROM T3  
)
SELECT BANK "구분", "예정", "실시"
  FROM T1, (
    SELECT NVL(TT2.WF_SEQ, TT3.WF_SEQ) SEQ, TT2.TXT "예정", TT3.TXT "실시"
      FROM TT2
  FULL OUTER JOIN TT3
        ON TT2.WF_SEQ = TT3.WF_SEQ
       AND TT2.LVL = TT3.LVL) TMP1
 WHERE T1.SEQ = TMP1.SEQ;

 


by 하수개발자 [2015.04.07 13:10:32]

모두 감사합니다 ㅎㅎ 개발뉴비님이 알려주신 구조와 비슷해서 적용하였습니다.

다시한번 정말 감사합니다 ㅎㅎ

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