暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

达梦数据库别名相同处理

2025-12-02
208

在迁移项目中遇到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只是为了迁移成功是一个不得以的办法,若工程量不大建议还是修改不同别名来解决问题

https://eco.dameng.com

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论