쿼리좀 봐주세요 ㅠㅠ 0 5 1,034

by 곰탱이 [2015.06.27 23:10:35]


WITH CODE
AS
(
    SELECT 'A' NM_1, '*' NM_2, '*' NM_3, 'A01' CD FROM DUAL UNION ALL
    SELECT 'B' NM_1, '*' NM_2, 'C' NM_3, 'A02' CD FROM DUAL UNION ALL
    SELECT '*' NM_1, '*' NM_2, 'B' NM_3, 'A03' CD FROM DUAL UNION ALL
    SELECT 'C' NM_1, '*' NM_2, '*' NM_3, 'A05' CD FROM DUAL
), 
DATA
AS
(
    SELECT 'AAAAA' KEY, 'A' NM_1, 'T' NM_2, 'D' NM_3 FROM DUAL UNION ALL
    SELECT 'BBBBB' KEY, 'B' NM_1, 'T' NM_2, 'C' NM_3 FROM DUAL UNION ALL
    SELECT 'CCCCC' KEY, 'C' NM_1, 'T' NM_2, 'D' NM_3 FROM DUAL UNION ALL
    SELECT 'DDDDD' KEY, 'C' NM_1, 'T' NM_2, 'B' NM_3 FROM DUAL
)
SELECT KEY, NM_1, NM_2, NM_3, CD
FROM
(
    SELECT AA.*
        , ROW_NUMBER() OVER(PARTITION BY CD ORDER BY RN1) RN
    FROM
    (
        SELECT DATA.*, CODE.CD
        FROM CODE,
        (
            SELECT ROW_NUMBER() OVER(ORDER BY NM_3 DESC) AS RN1, A.*
            FROM DATA A
        ) DATA
        WHERE
            DECODE(CODE.NM_1, '*', 'X', DATA.NM_1) = DECODE(CODE.NM_1, '*', 'X', CODE.NM_1)
        AND DECODE(CODE.NM_2, '*', 'X', DATA.NM_2) = DECODE(CODE.NM_2, '*', 'X', CODE.NM_2)
        AND DECODE(CODE.NM_3, '*', 'X', DATA.NM_3) = DECODE(CODE.NM_3, '*', 'X', CODE.NM_3)    
    ) AA
)
WHERE
    RN = 1

위의 쿼리를 실행하면 아래와 같은 나오는데 
좀 무식한 것 같아 이렇게 올려봅니다.

AAAAA A T D A01
BBBBB B T C A02
DDDDD C T B A03
CCCCC C T C A05

쿼리는 CODE 테이블에 NM1, NM2, NM3가 있는데 '*'가 들어가 있는건 아무값이나 들어가도 되고, 
'*' 가 아닌 부분은 값이 일치를 하는데 세개의 조건이 만족한 경우가 1순위이고, 그다음 2개의 조건, 그리고 1개의 조건만 만족할 경우 NM3가 우선순위 입니다.

by 마농 [2015.06.29 10:17:07]

조건이 불명확하네요.
3개 조건 만족이 1순위이고,
2개 조건 만족이 2순위인데...
2개 조건 만족에는 (1,2), (2,3), (1,3) 3가지 방법이 존재합니다. 어떤게 우선인지?
1개 조건 만족에는 NM3가 우선인데...
그렇다면 NM1 과 NM2 는 어떤게 우선인지?


작성하신 쿼리는 위 부족한 설명에도 부합되지 않고 있습니다.
선별을 위해 사용된 RN1 은 아무런 기준이 되지 않고 있습니다.


by 곰탱이 [2015.06.29 22:01:41]

제가 세부적으로 적어놓질 않았네요.. 답변 감사합니다.^^


by 창조의날개 [2015.06.29 11:59:10]

재미삼아 만들어 봤어요..

 


WITH CODE
AS
(
    SELECT 'A' NM_1, '*' NM_2, '*' NM_3, 'A01' CD FROM DUAL UNION ALL
    SELECT 'B' NM_1, '*' NM_2, 'C' NM_3, 'A02' CD FROM DUAL UNION ALL
    SELECT '*' NM_1, '*' NM_2, 'B' NM_3, 'A03' CD FROM DUAL UNION ALL
    SELECT 'C' NM_1, '*' NM_2, '*' NM_3, 'A05' CD FROM DUAL
), 
DATA
AS
(
    SELECT 'AAAAA' KEY, 'A' NM_1, 'T' NM_2, 'D' NM_3 FROM DUAL UNION ALL
    SELECT 'BBBBB' KEY, 'B' NM_1, 'T' NM_2, 'C' NM_3 FROM DUAL UNION ALL
    SELECT 'CCCCC' KEY, 'C' NM_1, 'T' NM_2, 'D' NM_3 FROM DUAL UNION ALL
    SELECT 'DDDDD' KEY, 'C' NM_1, 'T' NM_2, 'B' NM_3 FROM DUAL
)
SELECT KEY, NM_1, NM_2, NM_3, CD
FROM (
    SELECT KEY, AA.NM_1, AA.NM_2, AA.NM_3, CD
         , ROW_NUMBER() OVER(PARTITION BY KEY ORDER BY (DECODE(BB.NM_1,'*',1,AA.NM_1,2,0) + DECODE(BB.NM_2,'*',1,AA.NM_2,2,0) + DECODE(BB.NM_3,'*',1,AA.NM_3,3,0)) DESC) RN
    FROM DATA AA
       , CODE BB
)
WHERE RN = 1
;

 


by 곰탱이 [2015.06.29 22:05:26]

답변 감사합니다.
현재는 CODE가져오는 부분을 FUNCTION으로 해서 가져오고 있는데

CODE 테이블이나 DATA의 테이블의 데이터가 많아 속도부분에서 말썽이네요
창조의날개님 알려주신 부분을 참고하여 좀더 빠른 부분으로 선택해서 만들어봐야 겠네요

답변 감사합니다. 꾸벅

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