繁体   English   中英

postgres 中带有动态列列表的动态视图

[英]Dynamic view with dynamic list of columns in postgres

我有一个场景如下:

表 用户ID User viewname Description 1 JamesId employeeview This is a employee 2 FredId employeeview This is a employee 3 NickId managerview This is a manager

表属性ID key value user_ref 1 name james 1 2 phone 88888888888 1 3 email test@test.com 3 4 name fred 2 5 phone 555555555555 2

我需要创建如下视图:

EmployeeView Id empId name phone Description 1 JamesId james 88888888888 This is a employee 2 FredId fred 555555555555 This is a employee
Id empId name phone Description 1 JamesId james 88888888888 This is a employee 2 FredId fred 555555555555 This is a employee

ManagerView Id empId email Description 1 NickId test@test.com This is a manager

属性表是用户表的扩展,其中所有内容都存储为键值对。 需要使用以上两个表动态创建视图。 属性表是动态的。

是否可以生成这样的视图。 有人可以举一个例子来做到这一点。

我设法在 postgres 中使用交叉表功能来做到这一点。 但是,我不得不修改属性表以容纳另一列作为标识。

修改后的属性表:

+------+-------+---------------+-------------+-------------------+
| **ID |  key  |     value     |    user_ref |   identifier**    |
+------+-------+---------------+-------------+-------------------+
|    1 | name  |    james      |           1 |    viewemployee   |
|    2 | phone |  88888888888  |           1 |    viewemployee   |
|    3 | email | test@test.com |           3 |    viewmanager    |
|    4 | name  |    fred       |           2 |    viewemployee   |
|    5 | phone |  555555555555 |           2 |    viewemployee   |
+------+-------+---------------+-------------+-------------------+

员工视图使用交叉表的 Sql 查询:

create MATERIALIZED VIEW EmployeeView as
select one.id, one.userid, two.name, two.phone, one.description from 
user_table one,
(SELECT *
FROM crosstab(
  'SELECT user_ref,key,value FROM user_properties where identifier=''viewemployee'' order by 1,2')
AS
  ct_row (user_ref int, name varchar, phone varchar)) two
where
  one.id=two.user_ref

managerview使用交叉表的 Sql 查询:

create MATERIALIZED VIEW ManagerView as
select one.id, one.userid, two.email, one.description from 
user_table one,
(SELECT *
FROM crosstab(
  'SELECT user_ref,key,value FROM user_properties where identifier=''viewmanager'' order by 1,2')
AS
  ct_row (user_ref int, email varchar)) two
where
  one.id=two.user_ref

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM