포스트

오랜 기간 보호한 동물(2)

https://school.programmers.co.kr/learn/courses/30/lessons/59411

문제 문제

  • 문제 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
      -- 공통 테이블 표현을 생성
      WITH DIFFER_DATE AS (
          SELECT 
              I.ANIMAL_ID, 
              I.NAME, 
              O.DATETIME - I.DATETIME AS DIFFER
          FROM 
              ANIMAL_INS I
          INNER JOIN 
              ANIMAL_OUTS O
          ON 
              I.ANIMAL_ID = O.ANIMAL_ID
          ORDER BY 
              O.DATETIME - I.DATETIME DESC
      )
        
      -- 해당 CTE에서 처음 2개의 행을 선택
      SELECT 
          ANIMAL_ID, 
          NAME
      FROM 
          DIFFER_DATE
      FETCH NEXT 2 ROWS ONLY;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      -- Oracle 조인 문법
      SELECT 
          I.ANIMAL_ID, 
          I.NAME
      FROM 
          ANIMAL_INS I, ANIMAL_OUTS O
      WHERE 
          I.ANIMAL_ID = O.ANIMAL_ID (+)
          AND I.DATETIME <= O.DATETIME
      ORDER BY 
          O.DATETIME - I.DATETIME DESC
      FETCH FIRST 2 ROWS ONLY;
    
    1. WITH (Common Table Expressions 또는 CTE)
      • WITH는 공통 테이블 표현이라고도 불리며, 쿼리 내에서 임시 테이블 또는 임시 결과 집합을 만드는 데 사용된다.
      • CTE를 사용하면 쿼리의 가독성을 향상시키고 복잡한 쿼리를 단순화할 수 있다.
      • 주로 서브쿼리나 조인 작업을 수행하고, 그 결과를 더 간결하게 사용하기 위해 CTE를 생성할 때 사용된다.
    2. FETCH (FETCH FIRST n ROWS ONLY)
      • FETCH 구문은 행을 선택할 때 사용되며, 일반적으로 FETCH FIRST n ROWS ONLY 또는 FETCH NEXT n ROWS ONLY와 함께 사용된다.
      • FETCH FIRST n ROWS ONLY는 결과 집합에서 처음 n개의 행을 선택한다. 이를 통해 특정 행의 일부 또는 처음 몇 개의 결과를 가져올 수 있다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      SELECT ANIMAL_ID, NAME
      FROM (
      	  SELECT I.ANIMAL_ID, I.NAME, O.DATETIME - I.DATETIME AS "DURATION"
            FROM ANIMAL_INS I
            JOIN ANIMAL_OUTS O
            ON I.ANIMAL_ID = O.ANIMAL_ID
      )
      ORDER BY DURATION DESC
      FETCH FIRST 2 ROWS ONLY;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      SELECT *
      FROM (
            SELECT I.ANIMAL_ID, I.NAME
            FROM ANIMAL_INS I
            JOIN ANIMAL_OUTS O 
      	  ON I.ANIMAL_ID = O.ANIMAL_ID
            ORDER BY O.DATETIME - I.DATETIME DESC
      ) 
      WHERE ROWNUM <= 2;
    
    1. ROWNUM
      • 순차적인 정수: ROWNUM은 결과 집합에서 행의 순서를 나타내며, 가장 처음 선택된 행의 ROWNUM 값은 1이다. 다음 행은 2, 3, 4, …과 같이 증가한다.
      • 필터링 및 제한: ROWNUM을 사용하여 결과 집합에서 특정 순서의 행을 선택하거나, 일부 행을 필터링하는 데 사용된다. 예를 들어, WHERE ROWNUM <= 10은 처음 10개의 행을 선택한다.


  • 실행 결과

실행 결과 실행 결과

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