Sql 不明确的Oracle结果集
我正在使用一些编写得不太好的遗留SQL。有些模棱两可的选择似乎在很大程度上产生了我们预期的结果,但并非总是如此 下面是我所说内容的一个简化示例: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
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