如何在Oracle中基于多表创建含行转列逻辑的视图?
Oracle 多表创建视图:键值对表转列的解决方案
你需要的是把Table2这种键值对结构的数据,转成横向的列(Phone/Email/Mobile),和Table1的基础字段关联起来。这里给两种实用的实现方式:
方法1:条件聚合(推荐,性能更优)
利用CASE WHEN配合聚合函数,把同一REFPKEY下不同MUID的MUVAL提取成单独列:
CREATE VIEW vw_user_contacts AS SELECT t1.PKEY, t1.Name, t1.Street, MAX(CASE WHEN t2.MUID = 'TEL' THEN t2.MUVAL END) AS Phone, MAX(CASE WHEN t2.MUID = 'EMA' THEN t2.MUVAL END) AS Email, MAX(CASE WHEN t2.MUID = 'MBT' THEN t2.MUVAL END) AS Mobile FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.PKEY = t2.REFPKEY GROUP BY t1.PKEY, t1.Name, t1.Street;
说明:
LEFT JOIN保证即使Table2里没有某类联系方式(比如没有手机号),Table1的基础数据依然会显示,对应列值为NULLMAX()聚合是为了在同一PKEY下,把不同MUID的行合并成一行(如果你的数据中同一REFPKEY+MUID存在重复,可根据实际情况调整聚合逻辑)
方法2:多次左连接Table2
如果觉得聚合写法不直观,也可以对Table2按不同MUID分别做左连接:
CREATE VIEW vw_user_contacts AS SELECT t1.PKEY, t1.Name, t1.Street, tel.MUVAL AS Phone, ema.MUVAL AS Email, mbt.MUVAL AS Mobile FROM Table1 t1 LEFT JOIN Table2 tel ON t1.PKEY = tel.REFPKEY AND tel.MUID = 'TEL' LEFT JOIN Table2 ema ON t1.PKEY = ema.REFPKEY AND ema.MUID = 'EMA' LEFT JOIN Table2 mbt ON t1.PKEY = mbt.REFPKEY AND mbt.MUID = 'MBT';
说明:
- 每个连接只筛选对应MUID的数据,避免多表连接后产生笛卡尔积
- 同样用
LEFT JOIN保证主表数据不丢失
为什么之前的UNION/JOIN没成功?
你之前尝试的UNION是用来合并行数据的,而这里需要把行转列,方向不对;如果直接用普通JOIN不筛选MUID,会导致一行主数据对应多行联系方式,无法得到期望的单列结构。
内容的提问来源于stack exchange,提问作者tofesd
相关产品推荐
相关产品推荐

