Oracle物化视图创建报错求助:ORA-00957与ORA-00936问题
问题解决:物化视图创建的两个Oracle错误修复
错误1:ORA-00957 重复列名
原因:使用SELECT *查询三个关联表时,FLYING_INFO、DAYS、MONTHS_YEARS都包含id列,导致查询结果出现重复列名,物化视图不允许存在重复列名。
解决方法:
- 明确指定需要查询的列,避免包含重复列;
- 给重复的列添加唯一别名,比如将
DAYS.id命名为day_id,MONTHS_YEARS.id命名为my_id。
错误2:ORA-00936 缺少表达式
原因:WHERE子句中对子查询的写法错误,直接将=与未加括号的子查询连用,Oracle无法识别正确的表达式结构。另外,从SYSDATE提取日期部分无需通过DUAL表查询,直接调用EXTRACT函数即可。
解决方法:
- 移除冗余的
SELECT ... FROM DUAL结构,直接使用EXTRACT(MONTH FROM SYSDATE)作为比较值; - 若坚持使用子查询,必须将子查询用括号包裹(如
my.MONTH_NUM = (SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL)),但此写法无必要,直接调用函数更高效。
修正后的物化视图创建语句
CREATE MATERIALIZED VIEW MV_FLYING_INFO BUILD IMMEDIATE REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE) + 1 + 2/24 ON DEMAND DISABLE QUERY REWRITE AS SELECT fi.id AS flying_info_id, fi.FH, fi.TOS, fi.aircraft, fi.days, d.id AS day_id, d.day_num, d.months_years, my.id AS my_id, my.month_num, my.year_num FROM FLYING_INFO fi JOIN DAYS d ON fi.days = d.id JOIN MONTHS_YEARS my ON d.months_years = my.id WHERE my.month_num = EXTRACT(MONTH FROM SYSDATE) AND my.year_num = EXTRACT(YEAR FROM SYSDATE) AND d.day_num = EXTRACT(DAY FROM SYSDATE);
额外优化说明
- 用显式
JOIN语法替代旧的逗号分隔表写法,逻辑更清晰、可读性更强; - 移除
START WITH后多余的括号,SYSDATE无需包裹; - 明确指定所有列并添加别名,彻底避免重复列问题。
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

