Anyway

[DB] Select문 STRING_AGG() 함수 사용하기 본문

Database

[DB] Select문 STRING_AGG() 함수 사용하기

dyana 2024. 10. 4. 15:23

 

[부모 테이블]

seq_no

column1

column2

column3 

.

.

.

 

[자식 테이블]

child_seq_no

seq_no (foreign key)

column1

cloumn2

column3

.

.

.

 

이렇게 두 테이블이 존재할 때 데이터 상 부모 테이블의 seq_no가 1인 row의 자식 테이블의 row는 여러개가 존재하는 상황이다. 

클라이언트로부터 여러 필터값으로 조건이 들어가 검색될 때 부모테이블의 데이터는 row 한 줄로 출력되지만 그에 딸린 자식 테이블의 row가 여러개라 자식 테이블의 row만큼 부모 테이블의 row가 중복되서 나오는 게 별로였다. 

 

1️⃣

이전에도 이런 상황이 있었어서 그때 생각한 방법은 부모테이블을 먼저 불러온 다음 다시 한번 자식테이블에서 select로 필요한 컬럼의 값들을 모두 가져온 뒤 vo의 필드에 List로 넣어줬다. 

 

2️⃣

이번엔 이전 방법 말고 한 큐에 해결하는 xml을 짜고 싶었다. 아직은 어떻게 짜는 게 성능이 더 좋은지는 알아봐야겠지만

🤔

🤔

🤔

중복으로 나오는 부모테이블은 groub_by로 해결하고,

부모 테이블의 seq_no에 해당하는 여러개로 출력되던 자식 테이블의 컬럼은 STRING_AGG() 함수를 이용하기로 했다. 

 

STRING_AGG(t.value, ', ');

  •  t.value 컬럼을 기준으로 여러 값을 콤마(또는 원하는 구분자)로 연결하여 하나의 문자열로 합친다.
    이때 STRING_AGG()함수는 GROUB_BY 절에 의해 그룹화된 결과에 대해 작동한다. 
  • GROUP_BY 는 부모 테이블의 seq_no를 기준으로 그룹화하고 다른 모든 필드도 그룹화에 포함하여 중복 없이 한 줄로 데이터를 출력한다.

결과적으로 동일한 seq_no를 가진 부모 테이블의 row가 중복되지 않고 한 줄로 출력되며 관련된 자식 테이블의 value 값들이 콤마로 구분되어 하나의 필드에 표신된다!! 이전 방법처럼 두번 select문을 날려 합칠 필요 없이 하나의 쿼리로 해결된 것이다! 만족...! 

 

 

'Database' 카테고리의 다른 글

[DB] postgresql Count 함수 사용하기  (0) 2024.12.19
[DB] Mybatis에서 if문에 enum 비교값 사용하기  (2) 2024.12.18
[DB/JPA] ORM이란?  (0) 2024.08.22