이 쿼리를 바꿀수있을까요?? 0 3 1,007

by matrixkdg [2013.07.19 15:25:26]


 SELECT  ACADEMY_NAME,
        ENTRANCE_DATE,
        GRADUATION_DATE,
        MAJOR,
        MINOR,
        GRADE_AVERAGE,
        REMARK,
        TRANSCRIPT_URI,
        GRADUATION_URI,        
        EDUCATION_EXPERIENCE_ID
  FROM  TBLPMS9101              
 WHERE  HUMAN_RESOURCE_ID = 23

// 기존 헤더정보에 딸린 디테일 리스트를 가져오는 쿼리입니다.
여기에  TRANSCRIPT_URI, GRADUATION_URI,   부분은 카운터로 가져와야해서

     SELECT COUNT(*) AS CNT,DOC_NAME 
              FROM S_DOC_ATTACH 
         WHERE DOC_NAME IN ('TRANSCRIPT_URI_Edu_Exp','GRADUATION_URI_Edu_Exp') GROUP BY DOC_NAME

이렇게된 인라인을 FROM 절에 넣어서 해보려고했으나 보시다시피 INNERJOIN 형태에 저러한 인라인 쿼리를 넣었으니
 OUTTERJOIN으로 인한 2중데이터가 나오더군요..

최초에 생각을 잘못했겠거니 하고 제 나름의 방법으로 여러가지 해보았으나...
하지 못하고...

SELECT  ACADEMY_NAME,
        ENTRANCE_DATE,
        GRADUATION_DATE,
        MAJOR,
        MINOR,
        GRADE_AVERAGE,
        REMARK,
        (SELECT COUNT(*) AS CNT
            FROM S_DOC_ATTACH
         WHERE DOC_NAME='TRANSCRIPT_URI_Edu_Exp'
               AND DOC_ID=EDUCATION_EXPERIENCE_ID GROUP BY DOC_NAME) AS TRANSCRIPT_URI,
        (SELECT COUNT(*) AS CNT
            FROM S_DOC_ATTACH
         WHERE DOC_NAME='GRADUATION_URI_Edu_Exp'
               AND DOC_ID=EDUCATION_EXPERIENCE_ID GROUP BY DOC_NAME) AS GRADUATION_URI,        
        EDUCATION_EXPERIENCE_ID
  FROM  TBLPMS9101              
 WHERE  HUMAN_RESOURCE_ID = 23
이렇게 만들게 되었습니다만

혹시 이러한 형태를 FROM절에 인라인을 써서 출력하는 방법도 있지 않을까 너무 궁금해서 이렇게 질문글을 올려봅니다..

by 아린 [2013.07.19 15:46:19]
SELECT ACADEMY_NAME
     , ENTRANCE_DATE
     , GRADUATION_DATE
     , MAJOR
     , MINOR
     , GRADE_AVERAGE
     , REMARK
     , COUNT(DECODE(B.DOC_NAME, 'TRANSCRIPT_URI_Edu_Exp', 1)) AS TRANSCRIPT_URI
     , COUNT(DECODE(B.DOC_NAME, 'GRADUATION_URI_Edu_Exp', 1)) AS GRADUATION_URI
     , EDUCATION_EXPERIENCE_ID
  FROM TBLPMS9101 A
     , S_DOC_ATTACH B
 WHERE A.EDUCATION_EXPERIENCE_ID = B.DOC_ID    
 --WHERE A.EDUCATION_EXPERIENCE_ID = B.DOC_ID(+) 
   AND A.HUMAN_RESOURCE_ID = 23
 GROUP BY ACADEMY_NAME
        , ENTRANCE_DATE
        , GRADUATION_DATE
        , MAJOR
        , MINOR
        , GRADE_AVERAGE
        , REMARK
        , EDUCATION_EXPERIENCE_ID

by matrixkdg [2013.07.19 16:03:21]
감사합니다

그런데 제생각은

그룹바이를 저렇게 밑에 다 적기 싫어서

한테이블을 미리 카운터를 구해온거라서 약간 제가 하려했던 방식이랑은 다르네요 ㅎㅎ

by 아린 [2013.07.19 16:46:58]
원하시는게 아래와 같은 건가요.
아래 처럼 하실려면 JOIN 되는 
EDUCATION_EXPERIENCE_ID 컬럼이
UNIQUE 키가 되야 될듯 하네요.


SELECT A.ACADEMY_NAME
     , A.ENTRANCE_DATE
     , A.GRADUATION_DATE
     , A.MAJOR
     , A.MINOR
     , A.GRADE_AVERAGE
     , A.REMARK
     , B.TRANSCRIPT_URI
     , B.GRADUATION_URI
     , A.EDUCATION_EXPERIENCE_ID
  FROM TBLPMS9101 A
     , (SELECT EDUCATION_EXPERIENCE_ID
             , COUNT(DECODE(DOC_NAME, 'TRANSCRIPT_URI_Edu_Exp', 1)) AS
               TRANSCRIPT_URI
             , COUNT(DECODE(DOC_NAME, 'GRADUATION_URI_Edu_Exp', 1)) AS
               GRADUATION_URI
          FROM S_DOC_ATTACH 
         WHERE DOC_NAME IN ('TRANSCRIPT_URI_Edu_Exp','GRADUATION_URI_Edu_Exp')
         GROUP BY EDUCATION_EXPERIENCE_ID
        ) B
 WHERE A.EDUCATION_EXPERIENCE_ID = B.EDUCATION_EXPERIENCE_ID
 --WHERE A.EDUCATION_EXPERIENCE_ID = B.EDUCATION_EXPERIENCE_ID(+)
   AND A.HUMAN_RESOURCE_ID = 23
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입