我正在处理一些写得不太好的遗留SQL。有些模棱两可的选择似乎在很大程度上产生了我们期望的结果,但并不总是如此。
下面是我所说的一个简化的例子:
create table T1(
A VARCHAR2(10),
B VARCHAR2(10),
C VARCHAR2(10),
D VARCHAR2(10)
)
create table T2(
A VARCHAR2(10),
B VARCHAR2(10)
)
insert into T1(A, B, C, D)
values ('AA', 'BB', 'CC', 'DD' )
insert into T2(A, B)
values ('Y', 'N' )
到目前为止,除了正在使用的查询之外,没有什么异常。。。
SELECT * FROM T1, T2 WHERE T2.A ='Y' A B C D A_1 B_1 AA BB CC DD Y N SELECT * FROM T2, T1 WHERE T2.A ='Y' A B A_1 B_1 C D Y N AA BB CC DD
这显然是模棱两可的,Oracle试图通过在需要的地方重新指定后缀为_1的列来帮助我们。在某些情况下,Oracle会采取不同的处理方式吗?例如,不同版本等
例如,在第一个查询中,字段A的值是"AA",但在某些情况下,同一个查询会将字段A设置为"Y"吗?
现有的代码库到处都是这种东西,需要修复,现在我只是想评估这个问题有多严重?我主要担心的是,针对不同的Oracle版本运行相同的SQL可能会提供不同的结果。
谢谢!
编辑:明确计划是消除查询的歧义。目前的问题是,不同版本的Oracle将如何处理这一问题
如果可能的话,您可能应该遍历代码并显式设置列名和别名,还应该对任何通过列索引访问结果集的代码执行同样的操作。下面链接中的答案说明了你对目前的情况应该有多不舒服:
选择*与选择列
当然,我知道一些开发线索会建议,"如果它没有坏,就不要修复它",但你不是那个人,对吧?