복붙노트

[SQL] 어떻게 여러 행이 저장 프로 시저를 생성하지 않고 오라클의 하나로 연결될 수있다? [복제]

SQL

어떻게 여러 행이 저장 프로 시저를 생성하지 않고 오라클의 하나로 연결될 수있다? [복제]

어떻게 저장 프로 시저를 생성하지 않고 오라클에 다음을 달성 할 수 있습니까?

데이터 세트:

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

해결법

  1. ==============================

    1.이 문자열 집계를 할 수있는 많은 방법이 있지만 가장 쉬운 방법은 사용자 정의 함수입니다. 기능을 필요로하지 않는 방식이보십시오. 참고로, 기능없이 간단한 방법이 없습니다.

    이 문자열 집계를 할 수있는 많은 방법이 있지만 가장 쉬운 방법은 사용자 정의 함수입니다. 기능을 필요로하지 않는 방식이보십시오. 참고로, 기능없이 간단한 방법이 없습니다.

    이는 사용자 기능을 갖지 최단 경로이다 (이것은 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;
    
  2. ==============================

    2.오라클 11gR2에서, LISTAGG 절은 트릭을 수행해야합니다

    오라클 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를 사용할 수 있습니다.

  3. ==============================

    3.쉬운:

    쉬운:

    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에서

  4. ==============================

    4.이 OTN - 스레드 성능 비교를 포함하는 문자열 집계를 할 수있는 몇 가지 방법을 포함 : http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

    이 OTN - 스레드 성능 비교를 포함하는 문자열 집계를 할 수있는 몇 가지 방법을 포함 : http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

  5. from https://stackoverflow.com/questions/1076011/how-can-multiple-rows-be-concatenated-into-one-in-oracle-without-creating-a-stor by cc-by-sa and MIT license