2010-09-17 9 views
3

Je suis une recrue SQL et j'apprécierais beaucoup de l'aide sur ce problème plutôt basique.Erreur SQL: Identifiant invalide

select comp_table.* 
from (select column_1,avg(column_2) as "avg" 
     from table_1, group by column_1) comp_table 

→ déclarations correctes des enregistrements avec 2 colonnes nommées column_1 et avg

Mais si je change à:

select comp_table.avg 
from (select column_1,avg(column_2) as "avg" 
     from table_1, group by column_1) comp_table 

→ retours Erreur: identifiant non valide "Avg"

La chose est que je dois seulement sélectionner le 0 Colonne, donc je ne peux pas faire select comp_table.*. Pouvez-vous les gars s'il vous plaît aider?

En outre, si vous pouviez fournir quelques conseils d'optimisation pour la requête, ce serait génial.

+2

@John Kugelman: → nice! – egrunin

+0

[ORA-00904: Invalid Identifier] (http://www.dba-oracle.com/t_ora_00904_string_invalid_identifier.htm) ... –

Répondre

4

Lorsque le nom de la colonne n'est pas compris entre "guillemets doubles", le nom est normalisé en majuscules; Par conséquent, vous posiez la colonne "AVG", alors que le nom de la colonne est en fait "Avg":

select comp_table."avg" 
from (select column_1,avg(column_2) as "avg" 
    from table_1, group by column_1) comp_table 
+1

en fait, je double-citation des identifiants de colonne seulement si je voudrais les nommer dans ma langue maternelle, sinon je les laisse "tels quels". Il serait également judicieux de ne pas utiliser d'identifiants correspondant aux noms de fonctions oracle comme sum ou avg, pour éviter d'éventuelles confusions. –

+0

Dans PostgreSQL, un nom de colonne entre guillemets le rend sensible à la casse, c'est-à-dire que "mycolunm" diffère de "myColumn". Je ne sais pas si c'est la même chose pour d'autres bases de données. – Toto

+0

Dans Oracle, c'est un peu différent. ** Toutes les colonnes ** sont spécifiées en utilisant des guillemets (dans un sens) - c'est juste qu'elles nous donnent un raccourci qui signifie que nous pouvons omettre les guillemets si la colonne n'inclut que des majuscules et/ou des caractères de soulignement. Cependant, il est courant d'utiliser uniquement la syntaxe non citée pour nommer les colonnes dans Oracle. –

0

Je ne sais pas quel SGBD vous utilisez, mais certains se fâcheront que vous utilisiez .avg (parce que avg est réservé) et vous obliger à y échapper.

essayez de le changer avg-average, tout comme un test:

SELECT comp_table.average 
FROM (SELECT column_1, avg(column_2) as average 
     FROM table_1, GROUP BY column_1) comp_table 
+0

L'erreur aurait été que la fonction AVG manque un paramètre. En plus de l'utilisation de l'alias de table ... –

+0

TSQL est le seul que je connaisse qui supporte les crochets pour échapper les noms de tables, de colonnes et d'alias, ce qui, comme Emtucifor l'a fait remarquer, n'a pas ce problème. –

+0

@OMG Poneys: fixe. – egrunin

1

Quel serveur base de données utilisez-vous? AVG est une fonction intégrée dans tous ceux que je connais, donc vous auriez besoin de l'échapper correctement - ce qui dépend du serveur de base de données. Dans MS SQL Server, [avg]

+0

Ensuite, l'erreur aurait été que la fonction AVG manque un paramètre. En plus de l'utilisation de l'alias de table ... –

Questions connexes