쿼리 질문 하나 드립니다 ㅜㅜ 0 5 1,538

by 밀크캬라멜 [SQL Query] [2015.03.20 13:53:04]


 

 

안녕하세요

 

TEMPLATE이라는 테이블이 있는데 이 테이블 안에는

USERID(등록자), TYPE(타입), BASE(기본유무), TEAM(팀 유무) 칼럼 등이 있습니다.

 

TEMPLATE 테이블에서 

기본 템플릿을 가져오려고 하는데요,

 

순서가

1. USERID = '본인' , TYPE = '특정타입', BASE ='1'

2. USERID = '본인', TYPE = '공통타입', BASE ='1'

3. USERID = '본인과 같은 팀의 사용자', TYPE = '특정타입', TEAM='1'

4. USERID = '본인과 같은 팀의 사용자', TYPE = '공통타입', TEAM='1'

 

1,2,3,4 순으로.. 1의 결과가 존재하지 않으면 2의 쿼리를 실행하여 결과를 나타내는 식으로 하고싶습니다.

기껏 생각한 것이라고는 DECODE밖에 없는데요 ㅜㅜ

(예

SELECT
 DECODE (
   NVL((SELECT ID FROM TEMPLATE WHERE USERID='본인' AND TYPE='특정타입' AND BASE='1'),'')
  ,''
  ,DECODE(
    NVL((SELECT ID FROM TEMPLATE WHERE USERID='본인' AND TYPE='공통타입' AND BASE='1'),'')
    ,''
    ,DECODE ......
    )
 )

 

이런식으로요.. 값이 없을 시 DECODE를 이용해 점차 다음 쿼리를 실행할 수 있도록 만들긴 했습니다..

소스 길이가 너무 길어지다 보니 이것보다 간결하게 표현할 수 있지 않을까 싶은데

제가 아직 잘 몰라 더이상 좋게 만들어 낼 수가 없습니다 ㅠㅠ

알려주시면 감사합니당..

by 신이만든짝퉁 [2015.03.20 15:30:52]

이런방법은 어떻습니까?

SELECT *
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY '파티션단위(없으면 생략)' ORDER BY(
                 CASE
                     WHEN USERID = '본인' AND TYPE = '특정타입' AND BASE = '1' THEN 1
                     WHEN USERID = '본인' AND TYPE = '공통타입' AND BASE = '1' THEN 2
                     WHEN USERID = '본인과 같은 팀의 사용자' AND TYPE = '특정타입' AND TEAM = '1' THEN 3
                     WHEN USERID = '본인과 같은 팀의 사용자' AND TYPE = '공통타입' AND TEAM = '1' THEN 4
                     ELSE NULL
                 END) ASC) RN
             , A.*
          FROM TEMPLATE A)
 WHERE RN = 1

 


by 밀크캬라멜 [2015.03.20 16:23:17]

와 감사합니다! 전혀 생각도 못했던 방법이에요!^^ 소스 참고해서 잘 사용하겠습니다!


by DarkBee [2015.03.20 17:33:29]
아 막 더 줄여보고 싶은 욕구가 생기네요..

SELECT SUBSTR ( MAX ( CASE WHEN userid || type || base = '본인특정타입1'                    THEN '4' || id
                           WHEN userid || type || base = '본인공통타입1'                    THEN '3' || id
                           WHEN userid || type || base = '본인과 같은 팀의 사용자특정타입1' THEN '2' || id
                           WHEN userid || type || base = '본인과 같은 팀의 사용자공통타입1' THEN '1' || id
                           ELSE NULL
                       END
                   )
     , 2 )
  FROM template a

 


by 마농 [2015.03.22 13:32:55]

조건을 만족하는 행이 반드시 하나뿐이진 않을 듯 하다는 생각이 드네요.
Row_Number 을 Dense_Rank 로 대체하는게 맞을 듯.


by 밀크캬라멜 [2015.03.26 10:40:47]

각 조건당 행이 하나씩만 나오도록 등록하게 만들었습니다! Dense_Rank 처음 보는 것인데 한번 찾아봐야겠네요 감사합니다!

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