오라클 포함조건 AND 제외조건 관련 쿼리 질문드립니다. ㅜㅜ 0 3 2,448

by 코린이굔빈 [Oracle 기초] 오라클 포함조건 쿼리 [2023.04.28 16:17:56]


안녕하세요 현재 작업중인 쿼리가 존재합니다. 

해당 쿼리는 카드할인대상을 조건을 통해 출력하는 쿼리인데..

포함조건에는 채널(01) AND (상품(02) OR 협력사(03) OR 브랜드(04) 등등이 존재) 인데 쿼리가 생각처럼 잘 되지 않아 문의 드립니다.

 

상품테이블 A와

카드할인 테이블 B를 합쳐 원하는 데이터를 뽑아야 하는데 조건을 어떤식으로 걸어야 좋을까요?

 

현재 쿼리는

SELECT *

 FROM (SELECT A.*

            FROM ITEM_TABLE A // 상품 테이블

            INNER JOIN CARD_TABLE B ON 1 = 1 // 카드 마스터 테이블

           WHERE A.ITEM_CD = '123456'

              AND A.ITEM_CHN = '1001001'

              AND (SELECT COUNT(DISTINCT C.TARGET_CD) - COUNT(DISTINCT CASE WHEN '1001001' LIKE TRIM(C.TARGET_CD)||'%') THEN TAGET_CD ELSE NULL END)

                       FROM CARD_TARGET_TABLE C // 카드 대상 테이블

                     WHERE C.CARD_SEQ_NUM = B.CARD_SEQ_NUM

                        AND C.INCL_YN = '1' // 포함여부 1인 경우 포함 0인 경우 제외

                        AND C.USE_YN = '1') // 사용여부

                        AND C.TARGET_CD = '01' // 채널

           ) = 0 // 채널 관련

  AND EXISTS (SELECT 1

                    FROM CARD_TARGET_TABLE C

                  WHERE C.CARD_SEQ_NUM = B.CARD_SEQ_NUM

                     AND C.INCL_YN = '1'

                     AND C.USE_YN = '1'

                     AND ((C.TARGET_CD = '02' AND C.TARGET_VAL = A.ITEM_CD)

                            OR (C.TARGET_CD = '03' AND C.TARGET_VAL = A.VEN_CD)

                            OR (C.TARGET_CD = '04' AND C.TARGET_VAL = A.BRAND_CD))));

 

위 와 같은데, 포함 여부에서 채널 AND (상품 OR 협력사 OR 브랜드) 라는 조건 때문에 난관입니다.. 카드대상이 채널만 등록된 경우 아래 EXISTS 부분에서 거짓으로 떨어져서 SELECT이 안되고 있습니다.. 포함조건 및 제외조건 관련하여 좋은 방법이 없을까요? ㅜㅜ

위 쿼리는 포함만 작성하였습니다.

by 동동동 [2023.04.28 16:34:15]

ITEM_TABLE 과 CARD_TABLE 의 직접 연결되는 키는 없나요?


by 코린이굔빈 [2023.04.28 16:38:10]

직접 연결되는 키는 따로 없고 TARGET_CD에 따른 VAL 로 구분하고있습니다 EX ) ITEM_CD = TARGET_VAL 이런식으로여

CARD_TABLE은 CARD_TARGET_TABLE 과 위와 같이 연결됩니다. ITEM_TABLE은 상품의 정보만 가져오고 있습니다.


by 동동동 [2023.04.28 16:49:05]

AND (SELECT COUNT(DISTINCT C.TARGET_CD)

이부분 쿼리가 좀 이상하긴 한데...

먼저 저 조건에 해당하는 CARD_TABLE 와 CARD_TARGET_TABLE 의 정보를 구하시고 나서 ITEM_TABLE 와 조인해야 하는거 같이 보이네요..

SELECT * 

FROM ITEM_TABLE A

, (SELECT * FROM CARD_TABLE, CARD_TARGET_TABLE WHERE ... ) B

WHERE A....

이런 식으로요..

 

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