환경: 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을 사용하지 않고 조회할 수 있는 좋은 방법이 있을까요?
혹시 이러면 될까요? 최종 결과에 대한 내용이 좀 이해가 안되서..... 아래와 같은 성격(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