1

我正在使用一些写得不太好的遗留 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' 的情况?

现有的代码库到处都有这种东西,需要修复,现在我只是想评估一下这是一个多么严重的问题?我主要担心相同的 SQL,针对不同的 Oracle 版本运行可能会提供不同的结果。

谢谢!

编辑:要明确计划是消除查询的歧义。现在的问题是不同版本的 Oracle 将如何处理这个问题?

4

1 回答 1

2

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

选择 * 与选择列

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

于 2012-01-17T22:26:56.410 回答