Oracle结果集不明确



我正在处理一些写得不太好的遗留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将如何处理这一问题

如果可能的话,您可能应该遍历代码并显式设置列名和别名,还应该对任何通过列索引访问结果集的代码执行同样的操作。下面链接中的答案说明了你对目前的情况应该有多不舒服:

选择*与选择列

当然,我知道一些开发线索会建议,"如果它没有坏,就不要修复它",但你不是那个人,对吧?

相关内容

  • 没有找到相关文章

最新更新