728x90
반응형
상황
오라클로 개발되어 있는 상태에서 데이터베이스 Vendor만 티베로로 변경하였을때 LISTAGG(DISTINCT ~ )와 같이 LISTAGG 함수 내에 DISTINCT 키워드를 사용할 경우 티베로에서는 오류가 발생한다.
(지원하지 않는 문법)
티베로에서는 서브쿼리를 통해 전처리 DISTINCT 중복제거를 한 뒤, 해당 데이터를 기준으로 XMLAGG 함수를 활용해야한다.
CREATE TABLE TEST_LISTAGG (
ID NUMBER,
KEYWORD VARCHAR2(50)
);
INSERT INTO TEST_LISTAGG VALUES (1, 'apple');
INSERT INTO TEST_LISTAGG VALUES (1, 'banana');
INSERT INTO TEST_LISTAGG VALUES (1, 'apple');
INSERT INTO TEST_LISTAGG VALUES (1, 'cherry');
INSERT INTO TEST_LISTAGG VALUES (2, 'banana');
INSERT INTO TEST_LISTAGG VALUES (2, 'banana');
INSERT INTO TEST_LISTAGG VALUES (2, 'apple');
INSERT INTO TEST_LISTAGG VALUES (2, 'date');
WITH DISTINCT_KEYWORD AS (
SELECT DISTINCT ID, KEYWORD
FROM TEST_LISTAGG
)
SELECT
tl.ID,
LISTAGG(DISTINCT KEYWORD, ',') WITHIN GROUP (ORDER BY KEYWORD) AS LISTAGG_KEYWORD,
(
SELECT RTRIM(
XMLCAST(
XMLAGG(XMLELEMENT(ITEM, DK.KEYWORD || ',') ORDER BY DK.KEYWORD)
AS VARCHAR2(4000)
), ','
)
FROM DISTINCT_KEYWORD DK
WHERE DK.ID = tl.ID
) AS XMLAGG_KEYWORD
FROM TEST_LISTAGG tl
GROUP BY tl.ID
ORDER BY tl.ID;
오라클에서 실행해보면 LISTAGG_KEYWORD와 XMLAGG_KEYWORD 두 결과가 동일하게 나온다.
그러나 위와같은 방식은, Main 쿼리에 Where나 Group By에 의해 많은 조건이 들어갈 경우 서브쿼리에도 동일하게 적용해야하므로, 쿼리가 매우 길어지고 복잡해진다.
가장 효율적인 방법은 DISTINCT 키워드를 제거하고, 백엔드에서 컬렉션 등을 활용하여 중복을 제거하는 방법이다.
728x90
반응형