Syntaxe de requête SQL: Utilisation alias de table dans un compte est invalide? Pourquoi?

StackOverflow https://stackoverflow.com/questions/2906017

Question

Quelqu'un pourrait-il me s'il vous plaît expliquer pourquoi la requête suivante est invalide? Je l'exécution de cette requête sur la base de données Oracle.

select count(test.*) from my_table test;

je reçois l'erreur suivante: ORA-01747: user.table.column invalide, table.colonne ou spécification de colonne

mais , les deux requêtes suivantes sont valides.

select count(test.column) from my_table test;

select test.* from my_table test;
Était-ce utile?

La solution

COUNT(expression) comptera toutes les lignes où expression est non nul. COUNT(*) est une exception, elle renvoie le nombre de lignes. * n'est pas un alias pour my_table.*

Autres conseils

Pour autant que je sache, Count(Table.*) n'est pas officiellement pris en charge dans la spécification SQL. Seulement Count(*) (chiffre toutes les lignes retournées) et Count(Table.ColumnName) (compter toutes les valeurs non nulles dans la colonne donnée). Donc, même si le SGBD pris en charge, je recommande de ne pas utiliser it.`

Cette syntaxe ne fonctionne que dans PostgreSQL et seulement parce qu'il a un type d'enregistrement (pour lequel test.* est une expression significative).

Il suffit d'utiliser COUNT(*).

Cette requête:

select count(test.column) from my_table test;

vous renvoie le nombre d'enregistrements pour lesquels test.column n'est pas NULL.

Cette requête:

select test.* from my_table test;

va simplement vous renvoyer tous les enregistrements de my_table.

COUNT en tant que telle est probablement le seul agrégat qui est logique sans paramètres, et en utilisant une expression comme COUNT(*) est juste une façon d'appeler une fonction sans fournir de paramètres réels à elle.

Vous pourriez raisonnablement vouloir trouver le nombre d'enregistrements où test.column n'est pas NULL si vous faites une jointure externe. Comme chaque table doit avoir un PK (qui est non nul), vous devriez pouvoir compter les lignes comme ça si vous voulez:

select count(y.pk)
from x
left outer join y on y.pk = x.ck

COUNT (*) est pas bien ici parce que la jointure externe est la création d'une ligne de zéro pour la table qui est déficiente en information.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top