在单个视图中合并数据库中的多个表

dsf9zpds  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(327)

我的数据库里有三张table。
表1结构:

  1. date, family, class2, sec2, core1, nlm

表2结构:

  1. date, family, class2, sec2, core2, prefix

表3结构:

  1. date, family, class3, sec3, core3, root

我想创建一个结合这三个表的视图。视图的结构如下:

  1. date, class, sec, core, group_of_family

类在表1中显示为class1,表3中显示为class2,表3中显示为class3。sec和core也一样。
在上述数据中,一组日期、类别、秒和核心可以是不同系列的一部分,如:
表1结构:

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

表2结构:

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

表3结构:

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

所以我想要的视图应该是这样的:

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

我是一个新的postgresqldb,在编写复杂查询方面没有太多经验。
有人能帮我问一下吗?谢谢。

ep6jt1vc

ep6jt1vc1#

所以给定的数据是:

  1. create table tbl1
  2. (
  3. date date,
  4. family text,
  5. class2 text,
  6. sec2 text,
  7. core1 text,
  8. nlm text
  9. );
  10. insert into tbl1 values
  11. ('2020-07-22','f1','r1','p1','xyz','pqr'),
  12. ('2020-07-22','f2','r1','p1','xyz','pqrs'),
  13. ('2020-07-24','f5','r2','p4','sds','dsg');
  14. create table tbl2
  15. (
  16. date date,
  17. family text,
  18. class2 text,
  19. sec2 text,
  20. core1 text,
  21. nlm text
  22. );
  23. insert into tbl2 values
  24. ('2020-07-22','f4','r1','p1','xyz','pqr'),
  25. ('2020-07-24','f8','r6','p1','fds','sdg');
  26. create table tbl3
  27. (
  28. date date,
  29. family text,
  30. class2 text,
  31. sec2 text,
  32. core1 text,
  33. nlm text
  34. );
  35. insert into tbl3 values
  36. ('2020-07-28','f14','r1','p1','xyz','pqr'),
  37. ('2020-07-24','f18','r6','p1','fds','sdg');

查询:

  1. create view vw_test as
  2. select date,class,sec,core,string_agg(family,',') as group_of_family
  3. from
  4. (
  5. select date,class2 as class,
  6. sec2 as sec,
  7. core1 as core,
  8. family
  9. from tbl1
  10. union
  11. select date,class2 as class,
  12. sec2 as sec,
  13. core1 as core,
  14. family
  15. from tbl2
  16. union
  17. select date,class2 as class,
  18. sec2 as sec,
  19. core1 as core,
  20. family
  21. from tbl3
  22. )a
  23. group by date,class,sec,core;

检查预期结果:

  1. select * from vw_test;
展开查看全部
jaql4c8m

jaql4c8m2#

你必须使用 string_agg() 功能,

  1. select date, class2 as class, sec2 as ssec, core1 as core, string_agg(col2,' , ' order by class, sec) as group_of_family from
  2. (select date, family, class2, sec2, core1 from table1
  3. union all
  4. select date, family, class2, sec2, core1 from table2
  5. union all
  6. select date, family, class2, sec2, core1 from table3) qry
  7. group by date, class2, sec2, core1;

相关问题