Oracle 18 ROWNUM // LISTAGG() 데이터 합치기

2023. 10. 12. 16:30database

 

[참고링크] https://ribo.dev/28

[참고링크] https://turing0809.tistory.com/48

ROWNUM은 반환되는 쿼리결과의 임시 행번호이다. 그리고 반드시 1부터 시작하여 차례대로 붙여진다.

데이터를 1 ~ 10개 불러오는 경우  (WHERE ROWNUM > 0) 같은 조건이 없어도 WHERE ROWNUM <= 10 조건절로

오류없이 불러올 수 있다.

그러나 11부터 12까지의 데이터를 불러오려면 WHERE 조건절을 2번 사용한다. 

 

페이징 ***

※ 시행착오  - ROWNUM에 별칭 rn이 있어야 페이징처럼 동작한다.

11줄에 ROWNUM에 별칭 없이 14줄, 15줄 WHERE 조건에 ROWNUM으로 조건을 설정하면 동작하지 않는다.

ROWNUM 이 임시행이기 때문에 반드시 1부터 출력되므로 15줄 WHERE ROWNUM > 10 때문에 동작하지 않으므로

ROWNUM에 별칭 rn을 설정한다(11줄). 15줄에 WHERE rn > 10으로 고치면 두 WHERE 조건에 만족하는 쿼리가 출력된다.

만약 15줄을 주석처리하면 1 ~ 12번 데이터가 출력될 것이다.

 

ROWNUM 값을 별칭으로 새로운 컬럼으로  만들어 외부에서 ROWNUM에 부여한 별칭을 통해 페이징 처리한다.

 

페이징 구현하는 다른 방법 (WHERE rn BETWEEN 4 AND 8)

 

UNION, 유니온

두 테이블을 위 아래로 붙인다 JOIN은 옆으로 붙이는 반면에 UNION은 위 아래로 붙여서 속성명이 같아야 한다.

 

 

LISTAGG() 사용

LISTAGG()로 tbl_employees에서 departmentid가 같은 직원이름만 묶어주었다.

departmentid가 같은지가 기준이므로 departmentid 로 GROUP BY로 묶어준다.

employeename을 묶어야 한다 . 여러 employeename이 들어가는데 그 중에서 각각 이름을 구분하기 위해

,(콤마) 를 separator로 지정한다.

LISTAGG()를 사용할 때 WITHIN GROUP() 예약어와 함께 사용해서 그룹 내에 LISTAGG()를 사용해

employeename을 합친다.

(왼쪽)  데이터를 합치기 전에 departmentid로 묶는 기본 구조 //  (오른쪽)  왼쪽 기본구조에서 LISTAGG()로 departmentid가 같은 데이터끼리 합치기

 

 

 

[테이블편집] 창에서 열에서 가장 왼쪽에 PK에 기본키가 되는 속성에 체크한다.

속성을 입력하고 데이터타입, 크기, 널 여부 입력한다.

마지막 ID열 클릭하고 유형 '열 시퀀스' 클릭한다.

열 시퀀스를 클릭하는 이유는 데이터를 넣을 때 survey_id 숫자가 증가하게 하기 위해 넣었다

 

 

 

QUESTION_ID별로 ANSWER_TEXT별로 데이터 항목 갯수 출력

(1) SELECT QUESTION_ID FROM TBL_QUESTIONS WHERE SURVEY_ID=41 -> SURVEY_ID=41 조건을 만족하는 TBL_QUESTIONS 테이블에서 QUESTION_ID 속성을 조회한다.

(2) SURVEY_ID=41인 QUESTION_ID에 해당하는 데이터를 TBL_ANSWERS 테이블에서 조회한다

 

 

 

쿼리로 만든 테이블을 이미 만들었던 tbl_questions 테이블과 조인하기

연결 연산자로 다른 속성에 있는 데이터 연결