2016-08-02 2 views
0

У меня есть две таблицы:Союз объединения различных столбцов

Table1:

DATAID| NAME | FACTOR 

1 | Ann | 1 
2 | Kate | 1 
3 | Piter | 1 

Table2:

DATAID| NAME | FACTOR 

1 | John | 2 
6 | Arse | 2 
3 | Garry | 2 

Я хотел UNION эти таблицы и получить этот результат:

DATAID| NAME | FACTOR 

1 | Ann  | 1,2 
2 | Kate | 1 
3 | Piter | 1,2 
6 | Arse | 2 

Так что, когда есть 2 строки с одинаковым dataid, я хотел бы получить столбец «NAME» из Table1 и своего рода агрегированного ФАКТОРА, например, «1,2» или 3

+2

Что случилось с Джоном и Garry из второй таблицы? – mathguy

+0

это не имеет значения. Энн и Питер, Джон и Гарри не делают этого. – ifuwannaride

+0

Тогда вы не хотите СОЮЗ. Просьба уточнить ваше требование. Вы просто выполняете UNION для (dataid, factor), и вы выбираете имя из первой таблицы, если оно существует, а если нет, вы берете его из второй таблицы? – mathguy

ответ

1

Один метод использует listagg():

select dataid, name, 
     listagg(factor, ',') within group (order by factor) as factors 
from ((select dataid, name, factor from table1 t1 
    ) union all 
     (select dataid, name, factor from table2 t2 
    ) 
    ) t 
group by dataid, name; 

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

Или, если у вас есть только одна строка в каждой таблице, вы можете использовать full outer join:

select coalesce(t1.dataid, t2.dataid) as dataid, 
     coalesce(t1.name, t2.name) as name, 
     trim(leading ',' from coalesce(',' || t1.factor, ',') || coalesce(',' || t2.factor, '') as factors 
from t1 full outer join 
    t2 
    on t1.dataid = t2.dataid; 
+0

Вы заметили, что объединение (или объединение всех) таблиц OP не соответствует его/ее заявленному выводу? – mathguy

+0

[После ваших изменений:] полное внешнее соединение не будет работать, у него/нее разные имена для одного и того же идентификатора в двух таблицах и хочет сначала выбрать то, что было в таблице1; агрегатная функция также не будет работать (без дополнительной работы). – mathguy

+0

mathguy, точно. – ifuwannaride

0

Что-то, как это должно работать. В вашей реальной ситуации вам не понадобятся первые два CTE (подзапросы в предложении WITH, которые я добавил для тестирования).

with 
    table1 (dataid, name, factor) as (
     select 1, 'Ann' , 1 from dual union all 
     select 2, 'Kate' , 1 from dual union all 
     select 3, 'Piter', 1 from dual 
    ), 
    table2 (dataid, name, factor) as (
     select 1, 'John' , 2 from dual union all 
     select 6, 'Arse' , 2 from dual union all 
     select 3, 'Garry', 2 from dual 
    ), 
    u (dataid, name, factor, source) as (
     select dataid, name, factor, 1 from table1 
     union all 
     select dataid, name, factor, 2 from table2 
    ), 
    z (dataid, name, factor) as (
     select dataid, first_value(name) over (partition by dataid order by source), 
       factor 
     from u 
    ) 
select dataid, name, 
     listagg(factor, ',') within group (order by factor) as factor 
from z 
group by dataid, name 
order by dataid 
; 

Выход:

DATAID NAME FACTOR 
------- ----- --------- 
     1 Ann 1,2 
     2 Kate 1 
     3 Piter 1,2 
     6 Arse 2 

4 rows selected. 
Смежные вопросы