【问题标题】:Ambiguous Oracle Result Set模棱两可的 Oracle 结果集
【发布时间】: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 中始终如一地工作,直到我能正确解决这个问题。

标签: sql oracle ambiguous


【解决方案1】:

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

select * vs select column

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

【讨论】:

  • 不,我不是那种人,它需要修复。但是代码库很大,这需要一些时间。你知道不同版本的 Oracle 是否会以不同的方式处理查询?
  • 我认为 ruakh 的评论正确地说明了依赖于几层技术来获取这些列名。我不相信任何东西总是返回附加“_1”的列名,当这不是我能找到的任何标准的一部分时。不过,感谢您的接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多