Postgresql ROW _NUMBER 함수

Postgresql DB row_number() 함수

row_number 함수는 조회하는 데이터의 특정 집합내에서 select 결과의 건수의 변화없이 데이터를 조회하는 함수이다.

데이터베이스에서 상품 테이블과 이미지 테이블을 조인한 데이터를 가져오려고 하는 과정에서 문제가 한가지 발행하였다. 현재 개발중인 API서버에서 상품의 데이터들을 조회하여 15개씩 limit옵션을 사용하여 가져오려고 한다.
데이터베이스에 대한 심도있는 학습을 하지 않았던 탓일까 왜 당연히 15개의 상품이 모두 조회된다는 생각을 했던것일까…

기존 쿼리 및 결과

정말 쉽게 생각해서 간단하게 left join만 해주면 되는 문제다라는 생각으로 데이터베이스에 조회를 했다. 내가 작성한 쿼리는 다음과 같다.

  • sql

    1
    2
    3
    4
    5
    6
    select p.product_no, p.product_title, i.image_no, i.image_src
    from product p
    left join image i
    on p.product_no = i.image_product_no
    order by product_no desc
    limit 15;
  • 결과

15개의 데이터를 가져오기는 했다… 하지만 이것은 내가 가져오고자 한 데이터의 모든 정보를 가져와 주지않았다. 이렇게 쿼리를 작성해보니 당연한 결과였는데 어떻게 그렇게 단순하게 생각을 한건지 나에게 부끄러움을 느꼈다…

그래서 데이터베이스를 잘아는 분과 구글의 힘을 빌려 원하는 데이터를 가져올 수 있는 방법을 찾던중 postgresql이 orcle의 ROWNUM함수와 같은 기능의 함수를 제공한다는 정보를 통해 쿼리문을 수정하였다.

  • 수정된 sql

    1
    2
    3
    4
    5
    6
    7
    8
    9
    select p.product_no, p.product_title, i.image_src
    from
    (
    select row_number() over(order by a.product_no desc) as rn, a.product_no, a.product_title, a.product_user_no
    from product a
    ) as p
    left join image i on i.image_product_no = p.product_no and i.deleted = 'N'
    where rn <= 15
    order by p.product_no desc;
  • 결과

row_number 함수는 가져올 데이터의 갯수를 정하고 해당 값이 변동되지 않고서 정해진 데이터의 집합내에 모든 데이터를 가져와 주는 기능으로 사용하는 함수인듯 하다.
먼저 from절에서 서브쿼리로 데이터의 집합을 정하고 해당 집합의 데이터를 가져왔다.
이 방식을 사용하니 15개의 상품을 정상적으로 가져올수 있었고 이제 이 쿼리를 TypeOrm으로 가져가서 사용하면 될듯하다..
데이터베이스도 공부를 놓으면 안된다는걸 느끼는 과정이였다…

Author

han Ju Ryeon

Posted on

2021-09-09

Updated on

2021-12-05

Licensed under

댓글