Sql 不明确的Oracle结果集

Sql 不明确的Oracle结果集,sql,oracle,ambiguous,Sql,Oracle,Ambiguous,我正在使用一些编写得不太好的遗留SQL。有些模棱两可的选择似乎在很大程度上产生了我们预期的结果,但并非总是如此 下面是我所说内容的一个简化示例: create table T1( A VARCHAR2(10), B VARCHAR2(10), C VARCHAR2(10), D VARCHAR2(10) ) create table T2( A

我正在使用一些编写得不太好的遗留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' )
到目前为止,除了正在使用的查询之外,没有什么异常

这显然是模棱两可的,Oracle试图通过在需要的地方重新指定带有后缀_1的列来帮助我们。Oracle是否会在某些情况下以不同的方式处理此问题?例如,不同的版本等

例如,在第一个查询中,字段A的值为“AA”,但是否存在相同查询将字段A设置为“Y”的情况

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

谢谢大家!


EDIT:要清楚,计划是为了消除查询的歧义。现在的问题是,不同版本的Oracle将如何处理此问题?

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


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

这应该不是问题:如果你在真实的SQL应用程序中编写SQL查询,你永远不想使用
SELECT*
,而是使用
SELECT t1.col1,[…]
列的名称实际上不是结果集的一部分,它们与基础数据库一样依赖于编程语言和数据库驱动程序。此外,附加
\u 1
并没有真正的“帮助”(因为它不帮助您查找列),除非您使用的语言或框架能够自动将结果集行转换为关联数组。你应该在你的问题中添加任何相关的信息。我同意选择*是一种糟糕的方式。这是我继承的遗留代码。我希望找出这段代码是否能在Oracle的不同版本之间保持一致,直到我能正确地解决这个问题。不,我不是那个家伙,它需要修复。但是代码库是巨大的,这需要一些时间。你知道不同版本的Oracle是否会以不同的方式处理这个查询吗?我认为ruakh的评论正确地说明了依靠几个技术层来获得这些列名。我不相信任何东西总是返回附加有“_1”之类的列名,因为这不是我能找到的任何标准的一部分。不过,谢谢你的接受!
  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