【发布时间】:2012-01-17 20:52:52
【问题描述】:
我正在处理一些写得不太好的遗留 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 将如何处理这个问题?
【问题讨论】:
-
这应该不是问题:如果您在 REAL SQL 应用程序中编写 SQL 查询,您永远不想使用
SELECT *,而是使用SELECT t1.col1, [...] -
列名实际上并不是结果集的一部分,它们对编程语言和数据库驱动程序的依赖与对底层数据库的依赖一样多。此外,附加
_1并没有真正的“帮助”(因为它不能帮助您查找列),除非您使用的语言或框架会自动将结果集行转换为关联数组。您应该在您的问题中添加任何相关的此类信息。 -
我同意 Select * 是一种糟糕的方法。这是我继承的遗留代码。我希望找出这段代码是否能在不同版本的 Oracle 中始终如一地工作,直到我能正确解决这个问题。