조금은 이상하다고 느껴지는 요구사항을 만났다.
1:N 관계를 가진 테이블을 조인시켜,
대표적으로 하나의 데이터만 보여줘야 하는 요구사항이었다.
예를 들어 다음의 테이블이 있다고 가정하자.
설명하자면 하나의 상품이 있으면, 해당 상품을 판매하는 판매자는 여러 명이 될 수 있다.
하지만 사용자에게 보여줄 때는 모든 판매자를 보여주는 것이 아니라, 단 한 명의 판매자만 보여줘야 한다.
즉 1:N 관계의 테이블이나 마치 1:1 관계인 것처럼 보여줘야만 하는 것이다.
이를 테이블로 표현하면 아래와 같이 만들어진다.
물론 위처럼 조회용으로 테이블을 만들어서 별도로 만들면 편하겠지만,
오히려 코드가 복잡해질 가능성이 있고 관리해야 할 테이블이 늘어났다.
그리고 무엇보다 성격상 소위 말하는 가라를 치고 싶지 않았다.
그래서 과장님의 도움으로 이를 쿼리로 해결했고, 해당 방법을 작성해놓을 생각이다.
처음에는 Group By를 사용하여 해결하려고 했다.
하지만 상품 식별자를 기준으로 하나의 seller_name만을 뽑아야 하는 상황에서
seller_name을 Group By에 넣을 수는 없었기에 포기했다.
그리고 이를 대신하여 DISTINCT ON을 사용했다.
DISTINCT ON은 해당 구문을 기준으로 중복 행에서 첫 번째 행만을 유지시켜준다.
직접 사용해보자.
일단 위의 테이블을 그대로 사용하여보자.
위의 테이블대로 만든 후, 더미 데이터를 삽입하였다.
이제 앞서 언급한 요구사항과 같이
상품별 판매자 중 한 명의 판매자만을 보여줘보자.
쿼리는 다음과 같다.
SELECT DISTINCT ON(item_id)
item_info.item_id,
item_info.item_name,
seller_info.seller_name
FROM
item_info
INNER JOIN (
SELECT seller_name, item_id
FROM seller_info
) seller_info
ON item_info.item_id = seller_info.item_id;
'언어 > SQL' 카테고리의 다른 글
[PostgreSQL] VARCHAR 칼럼 내 일부 단어만 변경 (0) | 2024.02.05 |
---|---|
View와 Materialized View (0) | 2023.07.24 |
Batch Insert/Delete (0) | 2023.07.22 |
[PostgreSQL] 시간 쿼리 (0) | 2023.05.29 |
[PostgreSQL] 캐릭터형 AUTOINCREMENT (0) | 2021.10.25 |