oracle 10g sql子句编译错误

Posted

技术标签:

【中文标题】oracle 10g sql子句编译错误【英文标题】:oracle 10g sql with clause compilation error 【发布时间】:2010-10-25 19:53:57 【问题描述】:

编译错误说“mm”和“cc”是无效标识符!

with m as (
  select instructor, 
         count(*) as c 
    from class 
group by instructor),
     mm as ( 
  select max(m.c) as cc 
    from m)
select m.instructor 
  from m 
 where m.c = mm.cc;

【问题讨论】:

您想如何处理领带 - 是否应该显示所有领带? 【参考方案1】:

错误是因为mm 是子查询分解 (AKA CTE) 实例的名称,但如您所见:

SELECT m.instructor 
 FROM m 
WHERE m.c = mm.cc;

您尚未将mm 声明为m 实例的JOIN。使用:

WITH m AS (
    SELECT instructor, 
           COUNT(*) as c 
      FROM CLASS
  GROUP BY instructor),
     mm AS ( 
    SELECT MAX(m.c) as cc 
      FROM m)
SELECT m.instructor 
  FROM m
  JOIN mm ON mm.cc = m.c

【讨论】:

你太棒了,我不知道什么是子查询分解(又名 cte)实例! @baboonWorksFine:WITH 语法在 Oracle 中称为“子查询分解”,在 SQL Server 中称为“公用表表达式”(AKA CTE)...【参考方案2】:

我想你是想找一位上课最多的老师。

你不能用吗

Select m.instructor FROM (select instructor, count(*) as c from class group by instructor order by 2 desc) m where rownum = 1

【讨论】:

这只会返回 1 行,不是吗,如果一个以上的老师教的课最多怎么办? 您可以尝试从班级组中选择教师,count(*) 按教师 HAVING count(*) = (SELECT max(c) FROM (选择教师,count(*) as c from class group by教练)d)

以上是关于oracle 10g sql子句编译错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用

FPGA编译错误 Error (10133)

Arduino编译错误

vs2008编译错误:error C2146: 语法错误 : 缺少“;”(在标识符“name”的前面)

如何在编译时迅速使用#error引发错误

SQL 编译错误:位置 56 处的错误第 2 行无效标识符