在迁移项目中遇到oracle创建物化视图兼容别名相同可执行,但是在达梦数据库不做调整的情况下不兼容的问题,对此进行学习
首先我先列出两者数据库对此的规范
Oracle
Oracle 允许在 FROM 子句中为多个表指定相同的别名。
在解析列引用时,如果存在歧义,Oracle 会报错:“ORA-00918: column ambiguously defined”。
但若字段名不同,即使别名相同,Oracle 也能正常解析(因为列名唯一)
达梦数据库
达梦默认不允许在同一个 FROM 子句中使用相同的表别名(即使表结构不同)。
报错:无效的表或视图名[B1] 或类似提示 —— 实际是别名冲突导致解析失败。
这是一种语法层面的限制,而非运行时歧义检查。
现在我们在达梦数据库进行测试,非标准案例,只为测试oracle能解析的sql迁移到达梦数据库别名相同如何能继续执行
我们创建一张b1表和b2表,当b1表和b2表字段完全相同时
create table b1(id int,name varchar(20));
create table b2(id int,name varchar(20));
insert into b1 values(1,'a');
insert into b1 values(2,'a');
insert into b1 values(3,'a');
insert into b2 values(1,'b');
insert into b2 values(2,'b');
insert into b2 values(3,'b');
在oracle中执行出现报错
SYS@RHT(rht): 1> select * from b1 a,b2 a where A.id=2;
select * from b1 a,b2 a where A.id=2
*
ERROR at line 1:
ORA-00918: column ambiguously defined
会出现报错
[执行语句1]:
select * from b1 a,b2 a where A.id=2;
执行失败(语句1)
-2106: 第1 行附近出现错误:
无效的表或视图名[B1]
这是因为达梦数据库不兼容数据库有相同的别名,如果我们需要使达梦数据库兼容这个语法我们就需要创建一个hint
FROM_OPT_FLAG默认为0 动态,会话级 控制一些涉及 FROM 项的优化 0:不优化;1:尝试将 FROM 项替换为单个 DUAL 表;2:允许 FROM 项存在同名对象
select /*+FROM_OPT_FLAG(2)*/* from b1 a,b2 a where a.id=2;
结果是取的b1表的id=2在前
我再将上面sql表顺序写的相反看看结果
select /*+FROM_OPT_FLAG(2)*/* from b2 a,b1 a where a.id=2;
结果是b2的表的id=2在前
由此可以得出如果别名相同字段相同的时候where条件的别名会取第一个别名的结果
下面我再测试一下相同字段数,不同字段名的结果
create table b3(ida int,namea varchar);
create table b4(idb int,nameb varchar);
insert into b3 values(1,'a');
insert into b3 values(2,'a');
insert into b3 values(3,'a');
insert into b4 values(1,'b');
insert into b4 values(2,'b');
insert into b4 values(3,'b');
select /*+FROM_OPT_FLAG(2)*/* from b3 a,b4 a where a.ida=2;
select /*+FROM_OPT_FLAG(2)*/* from b4 a,b3 a where a.ida=2;
通过两个图结果可得如果字段名不同时,就是按表顺序展示结果,但筛选的条件还是按照有单独字段名字的表筛选
如果迁移失败的物化视图非常多,绑定hint工程量非常大,可以直接修改dm.ini参数,那么所有的sql都会兼容,而不是单挑sql兼容
SP_SET_PARA_VALUE(1,'FROM_OPT_FLAG',2);
总结
达梦数据库为什么默认不支持这个别名相同的语法,我认为是更强调明确性和安全性,避免因别名歧义导致的隐性错误,虽然标准未明文禁止同名别名,但数据库歧义我认识是一种很不标准的sql写法,而达梦数据库直接在别名层面默认禁止执行更是在规范自己开发sql,最好的方法还是规范开发sql使用不同的别名,本次迁移使用hint只是为了迁移成功是一个不得以的办法,若工程量不大建议还是修改不同别名来解决问题




