일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- PostgreSQL
- anymatch메서드
- route53
- Spring
- mybatis
- enumtype
- 지옥같은git
- 널포인터에러
- instance생성
- AWS
- listnull
- 3tierarchitecture
- stereotypeannotation
- db
- Annotation
- 열려있는포트
- 리스트중복제거
- string_agg()
- wordpress블로그
- port닫기
- conponent
- WordPress
- 권한정책
- enum
- 중복제거
- ansible
- awsconsole
- Java
- lightsail
- 리스트중복값
- Today
- Total
Anyway
[DB] Select문 STRING_AGG() 함수 사용하기 본문
[부모 테이블]
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 |