복붙노트

[SQL] 오라클에서 SELECT 문의 결과 목록을 쉼표로 구분 [중복]

SQL

오라클에서 SELECT 문의 결과 목록을 쉼표로 구분 [중복]

나는 "사람"이라는 이름의 테이블이 있습니다. 그것은 사람의 ID와 그것의 부모 ID를 포함합니다 (단 하나의 부모는 가능하다). 사람 ID 및 두 번째 칼럼 - - 그것의 아이들 ID의 목록 쿼리의 결과로, 내가 먼저 열이있는 테이블을합니다. 이 정확히 어떻게 할까? 나는 listagg 기능에 대해 읽었습니다,하지만 내 목적에 적합한 있는지 확실하지 않습니다. 그리고이 쿼리는 빈 두 번째 열을 생성합니다 :

, t1.id 선택 (사람 T2에서 t2.id을 선택 여기서 t2.parent_id = t1.id)를 인 T1로부터 여기서 t1.status = '부모';

해결법

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

    1.

    SELECT parent_id,
           RTRIM(XMLAGG(XMLELEMENT(e,child_id || ',')).EXTRACT('//text()'),',') AS "Children"
      FROM parentChildTable
     WHERE parent_id = 0
     GROUP BY parent_id
    

    또는

    SELECT parent_id,
           LISTAGG(child_id, ',') WITHIN GROUP (ORDER BY child_id) AS "Children"
      FROM parentChildTable
     WHERE parent_id = 0
     GROUP BY parent_id
    
  2. ==============================

    2.LISTAGG의 마크 구현은 확실히 오라클 11GR2 갈 수있는 방법입니다. 대한 11GR1 또는 Oracle (10) 대신 정확히 같은 방식으로 wmsys.wm_Concat을 사용할 수 있습니다 들어 (필요 수있는 권한은 DBA에서 부여)

    LISTAGG의 마크 구현은 확실히 오라클 11GR2 갈 수있는 방법입니다. 대한 11GR1 또는 Oracle (10) 대신 정확히 같은 방식으로 wmsys.wm_Concat을 사용할 수 있습니다 들어 (필요 수있는 권한은 DBA에서 부여)

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

    3.그것을 접근하는 또 다른 방법은 ...

    그것을 접근하는 또 다른 방법은 ...

    SELECT parent_id,max(child_list) FROM (
      SELECT parent_id,sys_connect_by_path(child_number,',') child_list FROM (
        SELECT parent_id, id,
               row_number() over (partition by parent_id order by id) child_number
          FROM person
          WHERE parent_id IS NOT NULL
      )
      START WITH child_number=1
      CONNECT BY parent_id = PRIOR parent_id AND child_number = PRIOR child_number + 1
    )
    GROUP BY parent_id
    ORDER BY parent_id
    ;
    
  4. ==============================

    4.) (wmsys.wm_concat을 선택 FROM;

    ) (wmsys.wm_concat을 선택 FROM;

    그것은 논쟁, 그러나 그것은 작동 - https://forums.oracle.com/forums/thread.jspa?threadID=2205545

  5. from https://stackoverflow.com/questions/5324996/comma-separated-list-as-a-result-of-select-statement-in-oracle by cc-by-sa and MIT license