저장된 절차를 만들지 않고 여러 행을 오라클에서 어떻게 연결할 수 있습니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1076011

문제

이 질문은 이미 여기에 답이 있습니다.

저장된 절차를 만들지 않고 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top