A 테이블은 ID 1~30 까지 행이 있습니다.
B 테이블은 데이터가 없을 수도 있고 아니면 A행만큼 데이터가 있습니다.
두개를 조인해서 데이터를 가져오는데 딱 9개 행만 가져오고 싶습니다.
B 테이블에 데이터가 없을 시
ID | 값 | 시간 | B 테이블마지막행 표시 |
1 | |||
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 |
위와같이 순번으로만 조회되어 9개를 뽑아옵니다
B 테이블에 데이터가 10개 미만으로 있을 시
ID | 값 | 시간 | B 테이블마지막행 표시 |
2 | 10 | 08:00 | |
5 | 13 | 08:10 | O |
1 | |||
3 | |||
4 | |||
6 | |||
7 | |||
8 | |||
9 |
위와 같이 B행에 값이 있는 기준으로 먼저 정렬되어 데이터를 가져오고 나머지를 A행 ID 순번으로 채웁니다.
시간 상 제일 마지막에 들어온 값은 표시를 해둡니다.
B 테이블의 값이 10개 이상일 경우
ID | 값 | 시간 | B 테이블마지막행 표시 |
24 | 10 | 09:00 | |
20 | 13 | 09:10 | O |
11 | 11 | 09:12 | |
25 | 13 | 09:13 | |
23 | 12 | 09:15 | |
21 | 12 | 09:28 | |
26 | 13 | 09:30 | |
28 | 10 | 09:30 | |
29 | 11 | 09:30 | O |
위와 같이 시간순으로 마지막 9개만 표현을 하고 마지막 3개의 시간이 같을 경우 순번이 큰 값 한개만
마지막행 표시 컬럼에 O 표시를 해서 가져오고 싶습니다.
WITH t_a AS ( SELECT LEVEL id FROM dual CONNECT BY LEVEL <= 31 ) , t_b AS ( SELECT 2 id, 10 v, '08:00' tm FROM dual UNION ALL SELECT 5, 13, '08:10' FROM dual --UNION ALL SELECT 11, 11, '09:12' FROM dual --UNION ALL SELECT 20, 13, '09:10' FROM dual --UNION ALL SELECT 21, 12, '09:28' FROM dual --UNION ALL SELECT 23, 12, '09:15' FROM dual --UNION ALL SELECT 24, 10, '09:00' FROM dual --UNION ALL SELECT 25, 13, '09:13' FROM dual --UNION ALL SELECT 26, 13, '09:30' FROM dual --UNION ALL SELECT 28, 10, '09:30' FROM dual --UNION ALL SELECT 29, 11, '09:30' FROM dual ) SELECT id , v , tm , DECODE(ROWNUM, 1, 'O') last_flag FROM (SELECT a.id , b.v , b.tm FROM t_a a , t_b b WHERE a.id = b.id(+) ORDER BY b.tm DESC NULLS LAST , NVL2(b.id, -a.id, a.id) ) WHERE ROWNUM <= 9 ORDER BY tm, id ;