如何创建自引用递归视图,无需重复查询即可计算视图衍生列
解决方案
完全不需要使用递归视图,用CTE(公共表表达式)或者嵌套子查询封装一层即可实现需求,不会重复执行关联表查询,也可以直接引用已经查询得到的updatedFx和updatedValue字段完成计算。
实现示例(CTE写法,主流数据库通用)
CREATE VIEW 你的视图名称 AS -- 封装原有逻辑,关联查询仅执行一次 WITH base_data AS ( SELECT t.id, t.fx, t.value, t.value * t.fx AS amount, -- 保留你原有获取updatedFx的关联查询逻辑,无需修改 关联表.fx AS updatedFx, -- 保留你原有获取updatedValue的关联查询逻辑,无需修改 关联表.value AS updatedValue FROM 你的原数据表 t -- 你需要用到的关联表查询逻辑,仅写一次即可 LEFT JOIN 关联表 ON t.id = 关联表.关联id ) -- 外层直接引用已计算好的字段得出updatedAmount,无需重复关联 SELECT *, updatedFx * updatedValue AS updatedAmount FROM base_data;
不支持CTE时可替换为嵌套子查询写法,效果一致
CREATE VIEW 你的视图名称 AS SELECT *, updatedFx * updatedValue AS updatedAmount FROM ( SELECT t.id, t.fx, t.value, t.value * t.fx AS amount, 关联表.fx AS updatedFx, 关联表.value AS updatedValue FROM 你的原数据表 t LEFT JOIN 关联表 ON t.id = 关联表.关联id ) base_data;
补充说明
- 上述写法中,关联表查询仅会在内部的CTE/子查询部分执行一次,外层只是对已查询出的结果做字段计算,不会产生额外的关联查询开销。
- 递归视图一般仅用于处理树形结构遍历、层级迭代等需要递归自引用的场景,你的需求完全不属于该范畴,使用递归视图反而会增加不必要的复杂度和性能风险。
内容的提问来源于stack exchange,提问作者zirt
相关产品推荐
相关产品推荐

