【问题标题】:ORA-00904 Invalid Identifier. Query works in 12c but not in 11gORA-00904 无效的标识符。查询在 12c 中有效,但在 11g 中无效
【发布时间】:2016-08-02 14:54:27
【问题描述】:

我有一个 LINQ 查询,试图在 oracle 11g 上执行它。 相同的查询在 12c 上执行得非常好,但在 11g 上会出现以下错误。

ORA-00904: "Extent1"."ID": invalid identifier

00904. 00000 -  "%s: invalid identifier"

*Cause:   
*Action:

以下是生成的 SQL。只显示查询中出错的特定部分,

SELECT 
  "Extent1".ID,
  (
    SELECT "top".ADMIT_DATE
    FROM 
          ( 
            SELECT "Project7".ADMIT_DATE
              FROM ( SELECT "Extent7".ADMIT_DATE FROM SYS.Table2 "Extent7" WHERE "Extent1".ID = "Extent7".ID )"Project7"
              ORDER BY "Project7".ADMIT_DATE ASC
          )  "top"
    WHERE ( ROWNUM <= 1) AND ROWNUM <= 1
  ) 
AS C1 FROM SYS.Table1 "Extent1";

谁能解释一下是什么导致了 11g 中的问题!此查询在 12c 上运行良好。

更新: 这是 linq 查询。 以上 SQL 是这些 linq 查询生成的 SQL 的一部分。

var query = from p in context.Person
            where p.Meetings.Any() &&
            p.Vitals.Any(v => v.WT.HasValue && v.WT >= 20 && v.WT <= 300) &&
            p.Detentions.Any(d => ((d.DX_TYPE != null && d.DX_TYPE == "09") || (d.DX_TYPE == null && "09" == null)) && d.DX.StartsWith("V") && d.DX != null) &&
            p.Meetings.Any(meet => meet.Detentions.Any(d => ((d.DX_TYPE != null && d.DX_TYPE == "09") || (d.DX_TYPE == null && "09" == null)) && d.DX.StartsWith("250") && d.DX != null))
            select new
            {
                p.HISPANIC,
                p.RACE,
                StudentID = p.PersonID,
                AdmissionOn = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault(),
                AdmissionYear = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault().Year,
                AdmissionMonth = p.Meetings.OrderBy(meet => meet.ADMIT_DATE).Select(meet => meet.ADMIT_DATE).FirstOrDefault().Month
            };

var g = query.GroupBy(k => new { Hispanic = k.HISPANIC, Race = k.RACE, AdmissionYear = k.AdmissionYear })
            .Select(k => new { Hispanic = k.Key.Hispanic, Race = k.Key.Race, AdmissionYear = k.Key.AdmissionYear, Persons = k.Count() }).ToList();

【问题讨论】:

  • 我很惊讶它可以在 12.1 中使用。通常,您不能引用超过一层深度的标识符。因此,“Extent1”将是您的 SELECT "top".ADMIT_DATE 内联选择中的有效标识符,但不是嵌套更深一层的内联视图中的有效标识符。也许 12.1 已经放宽了这一要求,尽管我不记得读过任何表明这是有意更改的内容。但是,您真的在寻找那个解释,还是在两个版本中都可以使用的查询?您的表真的在sys 模式中吗?这是非常不可取的。
  • 实际上这东西在 12c 中工作正常!!我并不是在寻找具体的解释,我所寻找的只是一个可行的解决方案。我想在linq中写这个,上面只是一个生成的SQL。我把 linq 查询弄乱了。
  • 也许包含生成该输出的 LINQ 查询会有所帮助。
  • @AlexPoole 添加了 LINQ 查询。

标签: linq oracle11g oracle12c


【解决方案1】:

问题在于 Oracle 11g 不支持引用标识符超过一个查询深度。 SQL Server(由 Microsoft 创建)确实支持这一点,这就是为什么您的 LINQ 工作正常,但 Oracle 服务器不喜欢 SQL。

本质上,它是 oracle 提供程序工具中的一个错误,无法将您的 LINQ 转换为 11g 版的有效 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2023-01-12
    • 2019-06-21
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多