2009-07-02 7 views

Odpowiedz

25

Istnieje wiele sposób na agregację ciąg, ale najłatwiej jest funkcja określona użytkownika. Try this for a way that does not require a function. Na marginesie nie ma prostej drogi bez tej funkcji.

to najkrótsza bez funkcji niestandardowych (używa ROW_NUMBER() i funkcje 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; 
+0

Działa świetnie! ROW_NUMBER() to, czego mi brakowało do wykonania sys_connect_by_path dla mnie. –

+1

Należy zauważyć, że gdy ta technika zostanie zastosowana do połączenia pola, którego wartość może zawierać separator, zostanie zgłoszony następujący błąd: 'ORA-30004: podczas korzystania z funkcji SYS_CONNECT_BY_PATH, nie może mieć separatora jako części wartości kolumny. ... i jeśli łączona wartość przekracza maksymalną długość 4000 bajtów, więc otrzymasz błąd: 'ORA-01489: wynik łączenia ciągów jest zbyt długi. – Somu

32

easy:

SELECT question_id, wm_concat(element_id) as elements 
FROM questions 
GROUP BY question_id; 

Pesonally przetestowane na 10 g ;-)

Od http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php

+3

Pamiętaj jednak, że wm_concat jest funkcją nieudokumentowaną. Więc możesz pomyśleć dwa razy zanim użyjesz tego w kodzie produkcyjnym. –

+0

Bardzo fajnie. Działa również dla mnie, ale muszę się upewnić, że ta funkcja jest dostępna w naszym środowisku produkcyjnym. –

+2

Występuje błąd -> ORA-00904 WM_CONCAT: Nieprawidłowy identyfikator –

69

Od Oracle 11gR2 klauzula LISTAGG powinno załatwić sprawę:

SELECT question_id, 
     LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) 
FROM YOUR_TABLE 
GROUP BY question_id; 
+3

Na marginesie możemy poznać wersję bazy danych, wysyłając zapytanie do tabeli 'v $ version' lub' product_component_version'. 11,2 wskazuje 11 gR2. – Somu

+0

w każdym razie pomógł mi – Almas

+0

Korzystanie z niego przez długi czas i jest to tak proste, jak to tylko możliwe. – elrado