问题现象
使用 create view 语句创建视图成功,但随后查询却报错 ORA-04063: view 'SYS.V_1' has errors。
创建视图。
obcleint > create view v_1 (c1,c2,c3,c4) as with t as (select * from y1) , st as (select * from y2 left join t on y2.id = t.id) select * from st; Query OK, 0 rows affected (0.177 sec)查询视图。
obcleint > select * from v_1; ORA-04063: view 'SYS.V_1' has errors
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
问题原因
视图定义里第二个 st 子表定义中 select * 出来的字段结果名字有重复,导致最终查询视图无法识别。单独视图定义 SQL 跑结果如下:其结果有两个 ID,两个 R1 列,所以视图这样无法识别出歧义的字段。
obclient > with t as (select* from y1) , st as (select *from y2 left join t on y2.id = t.id) select* from st;
输出结果如下。
+----+------+------+------+
| ID | R1 | ID | R1 |
+----+------+------+------+
| 1 | 100 | 1 | 2 |
+----+------+------+------+
1 row in set (0.006 sec)
解决方法
把视图定义里重复的字段重新命名,使其具备唯一性。修正后的视图创建语句如下。
obclient > create or replace view v_1 (c1,c2,c3,c4) as with t as (select *from y1) , st as (select y2.id id_y2,y2.r1 r1_y2 ,t.id id_t,t.r1 r1_t from y2 left join t on y2.id = t.id) select* from st;
Query OK, 0 rows affected (0.196 sec)
再次查询,报错代码消除,正常查询。
obclient >select * from v_1;
输出结果如下。
+----+------+------+------+
| C1 | C2 | C3 | C4 |
+----+------+------+------+
| 1 | 100 | 1 | 2 |
+----+------+------+------+
1 row in set (0.040 sec)
备注
MySQL 模式下创建 VIEW 时会做列名的检查,如果 VIEW 中包含重复列则创建时报错。