PostgreSQL如何创建视图合并多张不同列名的表数据
异构用户表合并统一维度视图创建方案
直接用UNION ALL按规则对齐三个表的字段即可,因为主键已经加了来源前缀,全局不会重复,没必要用性能差的UNION做全局去重。
字段对齐规则
提前把每个表的字段和目标字段做一一映射,缺省字段用NULL占位,保证每个子查询的列数、顺序、数据类型完全一致:
userId:表标识前缀+原表主键拼接为字符串,比如客户表主键1拼接为c_1、员工表主键1拼接为e_1userName:直接映射各表的姓名字段zip_code:直接映射各表的邮编字段contact:映射各表的联系号码字段,学生表无该字段用NULL占位
视图创建SQL
以下是MySQL/PostgreSQL通用的创建语法,直接执行即可:
CREATE VIEW v_unified_user AS -- 客户表数据映射 SELECT CONCAT('c_', c_id) AS userId, customer_name AS userName, postal_code AS zip_code, phone_number AS contact FROM customer UNION ALL -- 员工表数据映射 SELECT CONCAT('e_', e_id) AS userId, Employee_name AS userName, zip_code AS zip_code, mobile_no AS contact FROM Employee UNION ALL -- 学生表数据映射 SELECT CONCAT('s_', s_id) AS userId, student_name AS userName, post_code AS zip_code, NULL AS contact FROM student;
结果验证
针对提到的两条样例数据,执行SELECT * FROM v_unified_user查询视图,会输出符合要求的统一格式结果:
| userId | userName | zip_code | contact |
|---|---|---|---|
| c_1 | Company 1 | 对应邮编值 | 掩码联系电话 |
| e_1 | employee 1 | 对应邮编值 | 掩码手机号码 |
注意事项
- 如果使用SQL Server数据库,字符串拼接可以替换为
'c_'+CAST(c_id AS VARCHAR(50))的写法,避免类型转换报错 - 不要随意把
UNION ALL替换为UNION,后者会对全量结果做排序去重,数据量大时性能损耗非常明显,当前主键加前缀的规则已经保证全局唯一,不需要额外去重 - 后续新增其他来源的用户表时,只需要按照相同的字段映射规则追加
UNION ALL子句即可,不需要修改原有逻辑
内容的提问来源于stack exchange,提问作者Manihtraa
相关产品推荐
相关产品推荐

