不明确的Oracle结果集

时间:2012-01-17 20:52:53

标签: sql oracle ambiguous

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

1 个答案:

答案 0 :(得分:2)

如果可能,您应该仔细检查代码并显式设置列名和别名,并对通过列索引访问结果集的任何代码执行相同的操作。以下链接中的答案说明了您对当前情况的不满:

select * vs select column

当然,我知道一些开发者的暗示会暗示,“如果没有破坏,就不要修理它”,但你不是那个人,对吗?