2012-02-03 1 views
2

Я не уверен, задан ли этот вопрос где-либо еще раньше. Я не уверен, как это выразить. Но я объясню сценарий.
я следующие таблицы
Tab1 с колоннами: USERID, индекс, страна
TAB2 с колоннами: USERID, КОД, EMAILPL/SQL - выбор значений столбцов в виде массива строк

Пример содержимого:

TAB1: 
RISHI, A1B2C3, INDIA 
RISHI, D2E3F4, INDIA 
KANTA, G3H4I5, INDONESIA 

TAB2: 
RISHI, A1B2C3, [email protected] 
RISHI, A1B2C3, [email protected] 
RISHI, A1B2C3, [email protected] 
RISHI, D2E3F4, [email protected] 
RISHI, D2E3F4, [email protected] 
KANTA, G3H4I5, [email protected] 

Что я хочу от запроса на выборку или PL/SQL хранимая процедура является результатом так:

RISHI, INDIA, A1B2C3, ([email protected], [email protected], [email protected]) 
RISHI, INDIA, D2E3F4, ([email protected], [email protected]) 

Если я избранная, как:

select a.userid, a.code, a.country, b.email 
from tab1.a, tab2.b 
where a.userid = b.userid 
and a.code = b.code 
and a.userid = 'RISHI'; 

я получаю результат, как:

RISHI, INDIA, A1B2C3, [email protected] 
RISHI, INDIA, A1B2C3, [email protected] 
RISHI, INDIA, A1B2C3, [email protected] 
RISHI, INDIA, D2E3F4, [email protected] 
RISHI, INDIA, D2E3F4, [email protected] 

То, что я в принципе нужно, это идентификаторы электронной почты, сгруппированных вместе в массив. Предположим, что TAB1 содержит гораздо больше столбцов, которые я действительно требую, но в этом примере я опустил, но TAB2 имеет только эти три столбца.

ответ

1
select a.userid, a.code, a.country, listagg(b.email, ',') within group (order by b.email) as "Emails" 
from tab1.a, tab2.b 
where a.userid = b.userid 
and a.code = b.code 
and a.userid = 'RISHI' 
group by a.userid, a.code, a.country; 
+0

Ну, узнал, что это доступно только в Oracle 11g выпуска 2 , мы используем выпуск 1. К счастью, мои требования изменились, и мне не нужно было больше. Но это очень полезно знать. Благодарю. – rishi

0

Я думаю, вы хотите использовать агрегированную функцию GROUP_CONCAT в MySQL. Плохая новость заключается в том, что у Oracle нет встроенной функции для групповой конкременции, и хорошая новость заключается в том, что вы можете эмулировать такую ​​функциональность.

Посмотрите на этот фрагмент:

with data 
    as 
    (
      select job, 
       ename, 
       row_number() over (partition by job order by ename) rn, 
       count(*) over (partition by job) cnt 
     from emp 
    ) 
select job, ltrim(sys_connect_by_path(ename,','),',') scbp 
    from data 
    where rn = cnt 
    start with rn = 1 
    connect by prior job = job and prior rn = rn-1 
    order by job 

и возвратит

JOB  SCBP 
--------- ---------------------------------------- 
ANALYST FORD,SCOTT 
CLERK  ADAMS,JAMES,MILLER,SMITH 
MANAGER BLAKE,CLARK,JONES 
PRESIDENT KING 
SALESMAN ALLEN,MARTIN,TURNER,WARD 

REFERENCE

+1

11g имеет listagg – tbone