[英]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.