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
메인 쿼리와 서브쿼리인데요.
메인쿼리에 있는 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 ;