2010-10-25 38 views
1

L'erreur de compilation "mm" et "cc" est un identificateur invalide!oracle 10g sql avec erreur de compilation de clause

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

Comment voulez-vous traiter les liens - devraient tous les liens affichés? –

Répondre

5

L'erreur est parce que mm est le nom de l'Affacturage sous-requête (AKA CTE) par exemple, mais comme vous pouvez le voir:

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

Vous avez pas déclaré mm comme attacheront à l'm exemple. Utilisation:

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 
+0

vous êtes brillant, et je n'ai aucune idée de ce qui est sous-requête affacturage (aka cte) instance! – Rn2dy

+0

@baboonWorksFine: La syntaxe 'WITH' est appelée" Sous-requête Factoring "dans Oracle, et" Common Table Expression "(AKA CTE) dans SQL Server ... –

0

Je présume que vous essayez d'obtenir l'instructeur avec le plus de classes.

Pourriez-vous pas utiliser

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

cela ne retournera qu'une seule ligne, n'est-ce pas, et si il y a plus d'un instructeur qui enseigne le plus de cours? – Rn2dy

+0

Vous pouvez essayer sélectionner instructeur, compter (\ *) du groupe de classe par l'instructeur HAVING count (\ *) = (SELECT max (c) FROM (sélectionner instructeur, compter (\ *) comme c du groupe de classe par instructeur) d) – DJIDave

+0

cool. c'est correct je pense – Rn2dy