【问题标题】:error after migration from oracle 11g to 19c从 oracle 11g 迁移到 19c 后出现错误
【发布时间】:2020-10-17 03:13:05
【问题描述】:

谁能解释一下下面的选择是如何工作的:

select A.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

A.B.Column1 是什么意思?从 oracle 11g 迁移到 19c 后,我的包抛出错误:

PL/SQL: ORA-00904: "A"."B"."Col1":
         invalid identifier

【问题讨论】:

  • 这也应该导致 11g 出现错误
  • 这不是引用表列的有效方式。似乎不太可能刚刚引入了此语法错误。你是如何进行迁移的?您确定此代码在 11g 中有效吗?
  • 它只适用于 LEFT JOIN。当我更改为 INNER JOIN 时出现错误
  • 我唯一见过这样的事情是当“A”是另一个数据库/域并且您正在执行跨域查询时。反正这里好像不是这样。
  • 也许ATableB 的所有者?

标签: sql oracle


【解决方案1】:

它也不应该在 11g 中工作,但 ANSI 语法有时会出现问题 - 特别是在旧版本中 - 你碰巧遇到了一个令人困惑但相当温和的问题。

在这种情况下,解析器/优化器显然忽略了可能是但不是对表架构的引用。这似乎发生在将 ANSI 语法内部转换为本地 Oracle 语法的过程中。第一部分是什么并不重要。您已显示 A 匹配另一个表的别名,但这是巧合;这两项工作至少在 11.2.0.2 中有效,尽管在其他任何地方从未提及 Z

select A.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

select Z.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

我已经说过这是一个 ANSI 问题,因为 (a) 如您所提到的,内部联接出错,并且 (b) 老式外部联接语法也出错:

select A.B.Column1 Col1
FROM TableA A, TableB B
WHERE B.id = A.id (+);

ORA-00904: "A"."B"."COLUMN1": invalid identifier

SQL Fiddle demo

不必担心它以前是如何工作的,或者(例如)针对这样的旧版本提出服务请求。这是旧版 Oracle 中的一个错误,现在已修复。它不应该起作用,而且由于它 - 正确 - 在 19c 中不起作用,因此您必须通过删除流浪 A. 来修复它。

【讨论】:

    【解决方案2】:

    SQL 无效。

    知道这一点只有两种可能:

    1. 11g 同样出现错误;或
    2. 11g 比 19c 具有“更宽松”的容错性,并假设 A 还是 B,并在您的输出中应用了选择。

    无论哪种方式,鉴于它是您的包裹,解决方案应该相当简单:

    1. 如果您知道您期望结果来自哪个表,则从别名中删除不正确的表的引用

    2. 如果 A 有“Column1”而 B 没有,则删除“B”。来自别名

    3. 如果 B 有“Column1”而 A 没有,则删除“A”。来自别名

    4. 如果 A 和 B 都有 "Column1" 然后找到一个 11g 数据库并创建一个 虚拟查询,其中 A.id = B.id 和 A.Column1 的值不同于 B.Column1。然后运行查询,如果结果是 A.Column1 值 然后删除“B”。来自别名,但如果结果是 B.Column1, 删除“A”。来自别名。

    5. 如果您尝试实现“如果 B.Column1 为空,则返回 A.Column1 的值,否则返回 B.Column1 的值”的逻辑,然后更正您的 SQL 以读取如下内容:

        select case
                 when B.Column1 is null then
                 A.Column1
               else
                 B.Column1
               end as Col1
        from TableA A left join TableB B
        on B.id = A.id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多