안녕하세요 두 조건에 대해서 ROWNUM을 제한하는 방법 0 2 898

by 기린기린 [SQL Query] [2019.10.04 11:30:53]


환경: Oracle 10g

안녕하세요.

서로 중복되지 않는 다른 조건 A, B에 대해서

앞의 조건에 해당하는 레코드를 우선으로 레코드를 5개만 보여주고 싶습니다.

SELECT * FROM TAB1 
 WHERE (CODE1 LIKE 'A%' AND ROWNUM <= 5) 
    OR (CODE2 LIKE 'B%' AND ROWNUM <= 5 - (SELECT NVL(MAX(ROWNUM), 0) 
                                             FROM TAB1 
                                            WHERE CODE1 LIKE 'A%' AND ROWNUM <= 5)) 

 

OR조건에 각각의 ROWNUM을 사용하여 이렇게 조회했더니 제가 의도한 것과는 다르게 실행되더라구요.

의도대로 A, B가 같이 나오는 경우도 있고 한 쪽만 나오는 경우도 있고

각각의 조건이 아닌 OR 전체조회결과에 대해서 레코드 정렬순서에 따라 ROWNUM 조건이 적용돼 조회되는 것 같았습니다.

원하는 건 앞의 조건 A 레코드를 우선적으로 나오돼 A 레코드가 5개 미만이면 B조건의 레코드가 있을 경우 B도 같이 나와야합니다.

두 조건 다 합쳐서 5개 미만이면 5개 미만 그대로 나오면 됩니다.

여기서 추가적으로 UNION을 사용하지 않고 조회할 수 있는 좋은 방법이 있을까요?

by 농부지기 [2019.10.04 13:18:15]
혹시 이러면 될까요?
최종 결과에 대한 내용이 좀 이해가 안되서.....
아래와 같은 성격(RANK function)으로 해서 조정하면 될거 같은데요.

WITH V_TAB1 AS
   ( SELECT 'A01' CODE1, 'B01' CODE2 FROM DUAL UNION ALL
     SELECT 'A01' CODE1, 'B02' CODE2 FROM DUAL UNION ALL
     SELECT 'A15' CODE1, 'B03' CODE2 FROM DUAL UNION ALL
     SELECT 'A16' CODE1, 'B15' CODE2 FROM DUAL UNION ALL
     SELECT 'A18' CODE1, 'B16' CODE2 FROM DUAL UNION ALL
     SELECT 'A20' CODE1, 'B19' CODE2 FROM DUAL UNION ALL
     SELECT 'A25' CODE1, 'B21' CODE2 FROM DUAL
   )   
SELECT V.*
     , RANK() OVER (ORDER BY RN_A + RN_B) AS RN_ALL
  FROM (
		SELECT V.*
		     , RANK() OVER (ORDER BY CODE1) AS RN_A
		     , RANK() OVER (ORDER BY CODE2) AS RN_B
		  FROM V_TAB1 V
        )V



 


by 마농 [2019.10.07 09:05:59]
-- UNION ALL 을 사용하시면 됩니다.
-- 1번 쿼리 결과가 5건 이상이면 2번 쿼리는 실행되지 않습니다.
SELECT *
  FROM (SELECT *
          FROM tab1
         WHERE code1 LIKE 'A%'
         UNION ALL
        SELECT *
          FROM tab1
         WHERE code2 LIKE 'B%'
        )
 WHERE ROWNUM <= 5
;

 

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