저장된 절차를 만들지 않고 여러 행을 오라클에서 어떻게 연결할 수 있습니까? [복제하다
-
21-08-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
저장된 절차를 만들지 않고 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에서 사용할 수 있습니다. 오버플로에서 잘림/오류 이 문제를 다루기 위해.
쉬운:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
10g에서 가전적 인 테스트 ;-)
에서 http://www.oracle-base.com/articles/10g/stringaggregationtechniques.php
이 OTN- 스레드는 성능 비교를 포함하여 문자열 집계를 수행하는 몇 가지 방법이 포함되어 있습니다. http://forums.oracle.com/forums/message.jspa?messageid=1819487#1819487
제휴하지 않습니다 StackOverflow