Объедините несколько таблиц из базы данных в одном представлении - PullRequest
0 голосов
/ 03 августа 2020

У меня есть три таблицы в моей базе данных.

структура таблицы 1:

date, family, class2, sec2, core1, nlm  

структура таблицы 2:

date, family, class2, sec2, core2, prefix  

структура таблицы 3:

date, family, class3, sec3, core3, root 

Я хочу создать представление, объединяющее эти три таблицы. Представление будет иметь такую ​​структуру:

date, class, sec, core, group_of_family

класс представлен как class1 в table1, class2 в таблице 3 и class3 в table3. То же самое для se c и ядра.

В приведенных выше данных одна группа даты, класса, se c и ядра может быть частью другого семейства, например:

структура таблицы 1 :

date,       family, class2,    sec2,  core1, nlm
22/7/2020,   f1,       r1,      p1,   xyz, pqr
22/7/2020    f2,       r1,      p1,   xyz, pqrs
24/7/2020    f5,       r2,      p4,   sds, dsg

структура таблицы 2:

date,       family, class2,    sec2,  core1, nlm
22/7/2020,   f4,       r1,      p1,   xyz, pqr
24/7/2020    f8,       r6,      p1,   fds, sdg

структура таблицы 3:

date,       family, class2,    sec2,  core1, nlm
28/7/2020,   f14,       r1,      p1,   xyz, pqr
24/7/2020    f18,       r6,      p1,   fds, sdg

Итак, представление, которое я хочу, должно быть таким:

date,       class,   sec,  core,      group_of_family
22/7/2020,   r1,      p1,   xyz,      f1,f2,f4 
24/7/2020,   r2,      p4,   sds,        f5
24/7/2020,   r6,      p1,   fds,      f8,f18
28/7/2020,   r1,      p1,   xyz,        f14

Я новичок Postgresql db, и у меня нет большого опыта в написании сложных запросов.

Может ли кто-нибудь помочь мне с запросом? Спасибо.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Итак, данные следующие:

create table tbl1
(   
    date date,       
    family text, 
    class2 text,    
    sec2 text,  
    core1 text, 
    nlm text
);

insert into tbl1 values
('2020-07-22','f1','r1','p1','xyz','pqr'),
('2020-07-22','f2','r1','p1','xyz','pqrs'),
('2020-07-24','f5','r2','p4','sds','dsg');

create table tbl2
(   
    date date,       
    family text, 
    class2 text,    
    sec2 text,  
    core1 text, 
    nlm text
);


insert into tbl2 values
('2020-07-22','f4','r1','p1','xyz','pqr'),
('2020-07-24','f8','r6','p1','fds','sdg');

create table tbl3
(   
    date date,       
    family text, 
    class2 text,    
    sec2 text,  
    core1 text, 
    nlm text
);

insert into tbl3 values
('2020-07-28','f14','r1','p1','xyz','pqr'),
('2020-07-24','f18','r6','p1','fds','sdg');

Запрос:

create view vw_test as
select date,class,sec,core,string_agg(family,',') as group_of_family
from
(
    select date,class2 as class,
            sec2 as sec,
            core1 as core,
            family
    from tbl1
    union   
    select date,class2 as class,
            sec2 as sec,
            core1 as core,
            family
    from tbl2
    union
    select date,class2 as class,
            sec2 as sec,
            core1 as core,
            family
    from tbl3
)a 
group by date,class,sec,core;

Проверьте ожидаемый результат:

select * from vw_test;
0 голосов
/ 03 августа 2020

Вы должны использовать функцию string_agg(),

select date, class2 as class, sec2 as ssec, core1 as core, string_agg(col2,' , '  order by class, sec) as group_of_family from
(select date, family, class2, sec2, core1 from table1
union all
select date, family, class2, sec2, core1 from table2
union all
select date, family, class2, sec2, core1 from table3) qry
group by date, class2, sec2, core1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...