Syntaxe de requête SQL: Utilisation alias de table dans un compte est invalide? Pourquoi?
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;
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.