2017-01-20 7 views
0

Извините, если это было задано, просмотрите его немного и не нашли что-то совсем похожее на то, что мне нужно, но если оно есть, пожалуйста, ссылку.конкатенировать несколько столбцов из нескольких таблиц Oracle

Я использую Oracle и пытаюсь агрегировать результат по нескольким столбцам в нескольких таблицах, не используя временную таблицу. Пример ниже:

Table: USERS 
-------------- 
ID | USER_NAME 
-------------- 
1 | Bob 
2 | Joe 
3 | Mary 

Table: PROJECT_USERS 
---------------------------------- 
USER_ID | PROJECT_ID | ACCESS_TYPE 
---------------------------------- 
1  |123   |8 
1  |456   |9 
1  |789   |10 
2  |123   |10 
2  |456   |9 
2  |789   |8 
3  |123   |9 
3  |456   |10 
3  |789   |10 

Я был в состоянии использовать LISTAGG для некоторого успеха в делать вещи, как найти пользователей, которые находятся в той или иной продукции проекта в единое поле, используя запрос типа:

SELECT 
    LISTAGG(users.user_name, ',') WITHIN GROUP (ORDER BY users.user_name) 
FROM 
    users, 
    project_users 
WHERE 
    project_users.user_id = users.id 
    AND project_users.project_id = 123 
GROUP BY ID 
; 

(извинения, если синтаксис немного смещен в выше, заслоняя фактическую структуру и данные по причинам, так что это не точный запрос я использую в прямом эфире) Какой бы выход:

Bob,Joe,Mary 

Но то, что я хотел бы, чтобы выход был бы сочетание USERS.USER_NAME и PROJECT_USERS.ACCESS_TYPE агрегировать в подобном формате, возможно, с двумя значениями, разделенными -

Bob-8,Joe-10,Mary-9 

я могу получить индивидуальные возвращения

SELECT users.user_name || '-' || project_users.access_type... 

Возвращение

Bob-8 
Joe-9 
Mary-10 

и надеялся, что я мог тогда LISTAGG эти результаты, но, к сожалению, не удалось г и это работать. Как упоминалось ранее, временная таблица имеет право, по причинам, которые я не хочу вдаваться, хотя я уверен, что это упростит ситуацию. Использование SELECT в FROM не будет работать, я не думаю, что, как и в конце, я хотел бы иметь возможность использовать это в подзапросах, и мое понимание (и ограниченный опыт в его попытке) заключается в том, что он не будет правильно итерации для каждый проход. Может быть, я ошибаюсь, и просто сделал это неправильно.

Любые предложения?

Спасибо!

+0

На самом деле было бы проще вернуть данные так же, как в списке, в отличие от значений, разделенных запятыми, если вы собираетесь использовать его в подзапросе? – BobC

+0

@BobC, который был бы идеальным, но отчет, который используется для этого, неуклюже используется для анализа данных и повторного ввода его в нечто другое. Это действительно уродливо, а не то, как я вообще буду делать вещи, но в конце мне нужен подзапрос, чтобы вернуть одну строку, которая будет использоваться для этого. По-видимому, соблюдаются надлежащие стандарты целостности данных. – CascadeOverflow

ответ

0

Кажется, вы хотите что-то вроде этого. Не уверен, почему вы этого хотите (в данном случае), но он иллюстрирует метод, о котором вы спрашивали.

with 
    users (id, user_name) as (
     select 1, 'Bob' from dual union all 
     select 2, 'Joe' from dual union all 
     select 3, 'Mary' from dual 
    ), 
    project_users (user_id, project_id, access_type) as (
     select 1, 123, 8 from dual union all 
     select 1, 456, 9 from dual union all 
     select 1, 789, 10 from dual union all 
     select 2, 123, 10 from dual union all 
     select 2, 456, 9 from dual union all 
     select 2, 789, 8 from dual union all 
     select 3, 123, 9 from dual union all 
     select 3, 456, 10 from dual union all 
     select 3, 789, 10 from dual 
    ) 
-- End of test data (not part of the SQL query). 
-- Query begins below this line. 
select project_id, 
     listagg(user_name || '-' || to_char(access_type), ',') 
      within group (order by user_name) as comma_sep_list 
from users u join project_users p on u.id = p.user_id 
group by project_id 
; 

PROJECT_ID COMMA_SEP_LIST 
---------- -------------------- 
     123 Bob-8,Joe-10,Mary-9 
     456 Bob-9,Joe-9,Mary-10 
     789 Bob-10,Joe-8,Mary-10 

3 rows selected. 
+0

Так много любви! Это сделал трюк. Не уверен, что это был TO_CHAR, подразумеваемый JOIN или GROUP BY ... более вероятно, что в нескольких местах, теперь, когда я просматриваю то, что я пытался. Огромное спасибо! – CascadeOverflow

+1

Вы, вероятно, можете уйти без 'to_char()', мне просто не нравятся неявные преобразования. В остальном вы, возможно, будете правы. Ура! – mathguy

 Смежные вопросы

  • Нет связанных вопросов^_^