포스트

상위 n개 레코드

https://school.programmers.co.kr/learn/courses/30/lessons/59405?language=oracle

문제

  • 문제 풀이
    • 서브쿼리와 MIN 함수 사용

      1
      2
      3
      
        SELECT NAME 
        FROM ANIMAL_INS
        WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS);
      
      • ANIMAL_INS 테이블에서 가장 먼저 들어온 동물의 보호 시작일(DATETIME)이 가장 이른 날짜와 동일한 동물의 이름을 반환한다.
      • 이 쿼리는 보호소에 가장 먼저 들어온 동물의 이름을 조회하는데 사용될 수 있지만, 주의해야 할 부분이 있다.
      • 만약 여러 동물이 같은 최초 시간에 들어온 경우, 그 중 하나만을 랜덤하게 선택해서 반환하게 된다.
      • 동일한 시간에 들어온 여러 동물 중 하나만 필요하다면 이 쿼리를 사용할 수 있다. 하지만 만약 여러 동물이 동일한 시간에 들어왔을 때 모두를 필요로 한다면, 다른 방법을 사용해야 한다.


    • ORDER BY와 FETCH FIRST 사용

      1
      2
      3
      4
      
        SELECT NAME
        FROM ANIMAL_INS
        ORDER BY DATETIME
        FETCH FIRST 1 ROWS ONLY;
      
      • 보호소에 들어온 동물 중에서 가장 먼저 들어온 동물을 보호 시작일(DATETIME)을 기준으로 오름차순 정렬하고, 그 중 첫 번째 행을 반환한다.


      1
      2
      3
      4
      5
      6
      
        SELECT *
        FROM(SELECT NAME
             FROM ANIMAL_INS
             ORDER BY DATETIME ASC
            )
        WHERE ROWNUM = 1;
      
      • Oracle의 경우 ROWNUM이 적용되는 시점 때문에 조심해야 한다.
        1. ANIMAL_INS 테이블에서 이름을 보호 시작일(DATETIME)을 기준으로 오름차순으로 정렬한 후,
        2. 외부에서 이를 조회할 때 처음 한 개의 행만 반환한다.
      • 이 방법은 ROWNUM이 적용되는 타이밍에 따라 예상과 다른 결과를 보일 수 있다. 특히, 외부 쿼리에서 ROWNUM을 적용하기 전에 정렬이 이루어져야 올바른 결과를 얻을 수 있다. 이러한 이유로 이 방법은 정확한 결과를 보장하기 어려울 수 있다. 좀 더 일관된 결과를 얻기 위해서는 서브쿼리나 FETCH FIRST와 같은 다른 방식을 사용하는 것이 좋다.


  • 실행 결과

실행 결과

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.