반응형
저장 프로 시저를 만들지 않고 Oracle에서 여러 행을 어떻게 하나로 연결할 수 있습니까?
이 질문에 이미 답변이 있습니다.
- Oracle 11 답변의 여러 행에서 열 값을 연결하는 SQL 쿼리
저장 프로 시저를 만들지 않고 Oracle에서 다음을 수행하려면 어떻게해야합니까?
데이터 세트:
question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12
원하는 결과 :
question_id element_id
1 7,8
2 9
3 10,11,12
문자열 집계를 수행하는 방법은 여러 가지가 있지만 가장 쉬운 방법은 사용자 정의 함수입니다. 기능이 필요하지 않은 방식으로 이것을 시도하십시오. 참고로, 기능 없이는 간단한 방법이 없습니다.
이것은 사용자 지정 함수가없는 최단 경로입니다 : (ROW_NUMBER () 및 SYS_CONNECT_BY_PATH 함수 사용)
SELECT questionid,
LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM (SELECT questionid,
elementid,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev
FROM emp)
GROUP BY questionid
CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid
START WITH curr = 1;
Oracle 11gR2에서 LISTAGG 절은 트릭을 수행해야합니다.
SELECT question_id,
LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
결과 문자열이 너무 큰 경우 (예 : VARCHAR2의 경우 4000 자 이상)주의하십시오. 버전 12cR2에서 ON OVERFLOW TRUNCATE / ERROR 를 사용하여이 문제를 처리 할 수 있습니다 .
쉬운:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
10g에서 Pesonally 테스트 ;-)
에서 http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php
이 OTN 스레드에는 성능 비교를 포함하여 문자열 집계를 수행하는 여러 방법이 포함되어 있습니다. http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487
반응형
'developer tip' 카테고리의 다른 글
PHP 용 AWS SDK : 인스턴스 프로필 메타 데이터 서버에서 자격 증명을 검색하는 동안 오류가 발생했습니다. (0) | 2021.01.05 |
---|---|
세션에서 항목을 제거하는 ASP.NET? (0) | 2021.01.05 |
C ++에서 동적 배열을 어떻게 초기화합니까? (0) | 2021.01.05 |
서버의 현재로드에 영향을주지 않도록 MySQL 덤프 속도를 줄이려면 어떻게해야합니까? (0) | 2021.01.05 |
Django는 애플리케이션의 모델 목록을 가져옵니다. (0) | 2021.01.05 |