PostgreSQL创建视图时如何使用SELECT中新生成的列计算其他列
正确创建wwn视图的实现方案
你报错的核心原因是创建视图的语句中循环引用了还未创建的wwn视图本身,不需要额外创建临时视图,直接将结束时间的计算逻辑放到表关联条件中即可,正确实现如下:
-- 适配PostgreSQL等支持OVERLAPS语法的数据库 CREATE VIEW wwn AS SELECT t1.ID, t1.Time_of_start, (t1.Time_of_start + t1.Duration * INTERVAL '1 minute') AS Time_of_end, t1.Duration, t2.Name FROM table1 t1 LEFT JOIN table2 t2 ON (t2.time_of_login, t2.time_of_logout) OVERLAPS (t1.Time_of_start, t1.Time_of_start + t1.Duration * INTERVAL '1 minute') WHERE t1.ID = 300;
上述语句直接在关联table2时,通过table1的原生字段实时计算事件结束时间,再用overlaps判断和用户登录时段是否重叠,完全避开了引用未创建视图的问题。针对你提供的示例数据,执行后返回的视图结果和你的预期完全一致。
如果使用的数据库不支持OVERLAPS语法或者时间计算写法不同,可以替换为通用的时段判断逻辑,比如MySQL版本写法:
CREATE VIEW wwn AS SELECT t1.ID, t1.Time_of_start, DATE_ADD(t1.Time_of_start, INTERVAL t1.Duration MINUTE) AS Time_of_end, t1.Duration, t2.Name FROM table1 t1 LEFT JOIN table2 t2 ON t2.time_of_login < DATE_ADD(t1.Time_of_start, INTERVAL t1.Duration MINUTE) AND t2.time_of_logout > t1.Time_of_start WHERE t1.ID = 300;
内容的提问来源于stack exchange,提问作者SL07
相关产品推荐
相关产品推荐

