Linq ORA-00904无效标识符。查询在12c中有效,但在11g中无效
我有一个LINQ查询,试图在oracle 11g上执行它。 同样的查询在12c上执行得非常好,但在11g上会出现以下错误Linq ORA-00904无效标识符。查询在12c中有效,但在11g中无效,linq,oracle11g,oracle12c,Linq,Oracle11g,Oracle12c,我有一个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_DA
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();
问题是Oracle11g不支持在多个查询中引用标识符。Microsoft创建的SQL Server确实支持这一点,这就是为什么您的LINQ工作正常,但Oracle Server不喜欢SQL
从本质上讲,这是oracle提供程序工具中的一个缺陷,它没有将LINQ转换为适用于版本11g的有效SQL。问题在于oracle 11g不支持引用多个查询深度的标识符。Microsoft创建的SQL Server确实支持这一点,这就是为什么您的LINQ工作正常,但Oracle Server不喜欢SQL
从本质上讲,这是oracle提供程序工具中的一个缺陷,这些工具无法将LINQ转换为11g版的有效SQL。我很惊讶它在12.1版中可以工作。通常情况下,不能引用超过一层的标识符。因此,Extent1将是SELECT top.admission\u DATE inline SELECT中的有效标识符,而不是嵌套在更深一层的inline视图中的有效标识符。也许12.1已经放宽了这一要求,尽管我不记得读过任何表明这是有意更改的内容。但是,您是真的在寻找这种解释,还是在寻找一个在两个版本中都能工作的查询?您的表真的在sys模式中吗?这是非常不可取的。事实上,这个东西在12c中工作正常!!我不是在寻找具体的解释,我只是在寻找一个有效的解决方案。我想用linq写这个,上面只是一个生成的SQL。我对linq查询的理解有些混乱。也许包含生成该输出的linq查询会有所帮助。@AlexPoole添加了linq查询。我很惊讶它在12.1中能工作。通常情况下,不能引用超过一层的标识符。因此,Extent1将是SELECT top.admission\u DATE inline SELECT中的有效标识符,而不是嵌套在更深一层的inline视图中的有效标识符。也许12.1已经放宽了这一要求,尽管我不记得读过任何表明这是有意更改的内容。但是,您是真的在寻找这种解释,还是在寻找一个在两个版本中都能工作的查询?您的表真的在sys模式中吗?这是非常不可取的。事实上,这个东西在12c中工作正常!!我不是在寻找具体的解释,我只是在寻找一个有效的解决方案。我想用linq写这个,上面只是一个生成的SQL。我对linq查询感到困惑。也许包含生成该输出的linq查询会有帮助。@AlexPoole添加了linq查询。