๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ORACLE/SQL

[Oracle] LISTAGG ์ปฌ๋Ÿผ ๊ฒฐ๊ณผ ๋‚˜์—ดํ•˜๊ธฐ :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 4. 2.
1
2
3
4
5
SELECT
    DEPTNO
    ,ENAME
FROM EMP
ORDER BY DEPTNO;

ORACLE SCOTT๊ณ„์ •์˜ EMPํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

RDB์— ์ต์ˆ™ํ•ด์ง€๋ฉด ์œ„์™€๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ˆˆ์— ์ž˜ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜ ๋ฌธ์„œ์—์„œ๋Š” ๊ฐ ๋ถ€์„œ๋ณ„๋กœ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋Š”์ง€ ','๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š”๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

 

 

LISTAGG ํ•จ์ˆ˜

1
2
3
4
5
SELECT
    DEPTNO
    ,LISTAGG(ENAME, ',') WITHIN GROUP(ORDER BY ENAME) AS EMPS
FROM EMP
GROUP BY DEPTNO;
 

LISTAGGํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋กœ๋กœ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GROUP BYํ•œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ GROUP์•ˆ์˜ ์นผ๋Ÿผ์„ ๋‚˜์—ด์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

MULTI INDEX ํ™•์ธ

LISTAGGํ•จ์ˆ˜๋Š” ์–ด๋Š๋•Œ์— ์‚ฌ์šฉ์ด ๋ ๊นŒ์š”? ๋ฌธ์„œ์ž‘์„ฑ์ด ํ•„์š”ํ• ๋•Œ ์‚ฌ์š”๋ ์ˆ˜๋„ ์žˆ๊ณ , DB๋‚ด์—์„œ๋Š” MULTI INDEX์—์„œ ์–ด๋–ค ์ปฌ๋Ÿผ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

1
2
CREATE INDEX EMP_MULTI_IDX
ON EMP (DEPTNO, JOB, MGR);

DEPTNO, JOB, MGR์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ INDEX๋กœ ๋งŒ๋“ค์–ด ์คฌ์Šต๋‹ˆ๋‹ค.

 

 

1
2
3
4
5
6
SELECT
    INDEX_NAME
    ,COLUMN_NAME
    ,COLUMN_POSITION
FROM USER_INDEXES NATURAL JOIN USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMP';

์ƒ์„ฑํ•œ INDEX๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ MULTI COLUMN INDEX์˜ ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ–‰์œผ๋กœ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ํŽธํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด LISTAGG ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€๋กœ๋กœ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

1
2
3
4
5
6
7
8
SELECT
    INDEX_NAME
    ,LISTAGG(
        INDEX_NAME || ':' || COLUMN_POSITION, ','
    ) WITHIN GROUP(ORDER BY INDEX_NAME) AS IDXS
FROM USER_INDEXES NATURAL JOIN USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMP'
GROUP BY INDEX_NAME;

 

๋Œ“๊ธ€