쿼리 질문 입니다. 0 2 1,659

by 동안이 [2015.11.06 19:56:59]


TB_PHOTO 라는 메인 테이블을 조회하는 쿼리 입니다.

그리고 WHERE 절에서 검색조건에 있는 카테고리를 조회 하기 위해서 조건을 주었습니다.

그런데 문제는. SELECT 절에서 보고 싶은데. 싱글로우가 아니라서 에러가 발생 합니다.

카테고리의 PK값 구조는

테이블명           컬럼

TB_PHOTO         사진ID : P_ID

                                   1

                                   2

TB_PHOTOCATEGORY    사진ID : P_ID,  카테고리 ID : CA_ID

                                             1                         96

                                             2                         99

TB_CATEGORY    카테고리ID : CA_ID  카테고리명 : CA_NAME

                               96                                   축구

                               99                                   농구

이렇게 되어 있고 TB_PHOTO 테이블에는 CA_ID 와 CA_NAME 컬럼이 없습니다.

 

그런데 아래처럼 쿼리를 짜니까.

(SELECT CA_NAME
            FROM TB_PHOTOCATEGORY TPT, TB_CATEGORY TC
           WHERE TPT.CA_ID = TC.CA_ID(+) AND TPT.P_ID = A.P_ID)
            AS CA_NAME

이 부분 때문에

싱글로우가 아니라고 에러가 발생하는데

어떻게 해야 WHERE절에 조건에 맞는 싱글로우로 나오게 할 수 있을까요? 

 

SELECT                                              /** 일반검색 엑셀조회 SELECT **/

          P_ID 
         , (SELECT CA_NAME
            FROM TB_PHOTOCATEGORY TPT, TB_CATEGORY TC
           WHERE TPT.CA_ID = TC.CA_ID(+) AND TPT.P_ID = A.P_ID)
            AS CA_NAME
   FROM TB_PHOTO A
   WHERE  1 = 1
      AND P_STATUS IN ('2', '3')
      AND A.P_ID IN (SELECT P_ID
                       FROM TB_PHOTOCATEGORY
                         WHERE CA_ID IN ('96', '99'))
ORDER BY P_ID DESC

by 마농 [2015.11.07 15:08:46]

메인 쿼리와 서브쿼리인데요.
메인쿼리에 있는 CA_ID IN ('96', '99') 조건이 스칼라 서브쿼리에는 없네요.
아마도 이 때문에 중복이 발생한 듯 합니다.
 

SELECT p_id
     , (SELECT ca_name
          FROM tb_photocategory tpt
             , tb_category      tc
         WHERE tpt.ca_id = tc.ca_id(+)
           AND tpt.p_id  = a.p_id
           AND tpt.ca_id IN ('96', '99')    -- 요기
        ) AS ca_name
  FROM tb_photo a
 WHERE 1 = 1
   AND p_status IN ('2', '3')
   AND a.p_id IN (SELECT p_id
                    FROM tb_photocategory
                   WHERE ca_id IN ('96', '99')
                  )
 ORDER BY p_id DESC
;

그런데. tb_photocategory 테이블이 IN 에서도 사용되고 스칼라서브쿼리에서도 사용되네요.
비효율을 제거하는게 좋을 듯 하네요. 일반 조인으로 풀어내는 것이 좋을 듯.
 

SELECT a.p_id
     , tc.ca_name
  FROM tb_photo         a
     , tb_photocategory tpt
     , tb_category      tc
 WHERE 1 = 1
   AND a.p_status IN ('2', '3')
   AND tpt.ca_id = tc.ca_id(+)
   AND tpt.p_id  = a.p_id
   AND tpt.ca_id IN ('96', '99')
 ORDER BY p_id DESC
;

 


by 동안이 [2015.11.09 09:44:06]

조인으로 이렇게 풀어서 효율적으로 하는 방법이 있었다니..

마뇽님 감사합니다. 좋은 공부 하고 갑니다. ^^ 

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