AYANT sans GROUP BY
- Est la suivante possible selon la norme(!) SQL?
- Un peu de changements devraient être nécessaire afin d'être conformes à la norme (si elle n'est pas déjà le cas)?
- Il fonctionne comme prévu dans MySQL, le forum de la première ligne contient la valeur maximale pour NumberOfPages.
SELECT *
FROM Book
HAVING NumberOfPages = MAX(NumberOfPages)
Le suivant est écrit dans la norme:
HAVING <search condition>
- Soit G l'ensemble constitué de toutes les colonnes référencées par un <colonne de référence> contenues dans le <clause group by>.
- Chaque colonne de référence directement contenue dans le <condition de recherche> doit être l'un des suivants:
- Une claire référence à une colonne qui est fonctionnellement dépendant G.
- Une référence externe.
Quelqu'un peut-il m'expliquer, pourquoi il devrait être possible conformément à la norme?
Dans MySQL, il fonctionne parfaitement.
- Quelles sont les autres DB êtes-vous essayer de? Oracle, MSSQL, etc?
Vous devez vous connecter pour publier un commentaire.
Malgré la Mimer Validateur conséquent, je ne crois pas que le vôtre est valable Standard SQL.
Un
HAVING
clause sansGROUP BY
clause est valide et (sans doute) utile de syntaxe dans le Standard SQL. Parce qu'il fonctionne sur la table de l'expression tout à la fois comme un jeu, pour ainsi dire, il ne fait vraiment sens pour utiliser des fonctions d'agrégation. Dans votre exemple:n'est pas valide car lorsque l'on considère l'ensemble du tableau, la ligne qui ne
NumberOfPages
référence? De même, il est préférable d'utiliser des valeurs littérales dans leSELECT
clause.Considérez cet exemple, qui est valable Standard SQL:
En dépit de l'absence de la
DISTINCT
mot-clé, la requête ne retournera jamais plus d'une ligne. Si leHAVING
clause est satisfaite alors le résultat sera une seule ligne avec une seule colonne contenant la valeur " T " (indiquant que nous avons des livres avec différents nombres de pages), sinon le résultat sera l'ensemble vide c'est à dire zéro lignes avec une seule colonne.Je pense que la raison pour laquelle la requête n'a pas d'erreur dans le serveur mySQL est en raison de exclusifs extensions qui causent la
HAVING
clause (logiquement) venir à l'existence après laSELECT
clause (la Norme de comportement est l'inverse), couplé avec l'impliciteGROUP BY
clause mentionnée dans d'autres réponses.De la norme (caractères gras ajoutés à partir de l'accent)
1) Laissez-HC être de la clause having. Laissez-TE-être l'expression de table qui a immédiatement contient HC. Si TE n'a pas immédiatement contenir une clause group by, puis “GROUPE PAR ()” est implicite. T est le
descripteur de la table définie par le GBC immédiatement contenues dans TE et soit R
le résultat de GBC.
Avec le groupe implicite par alinéa, la référence externe, on peut accéder à la TE colonnes.
Toutefois, la certification de ces normes est très bien d'une auto-certification de ces jours, et l'exemple que vous avez donné ne pourrait pas fonctionner dans tous les principaux fournisseurs de SGBD.
“Lorsque GROUP BY n'est pas utilisé, DEVOIR se comporte comme une clause where.”
La différence entre où et avoir: OÙ les filtres de LIGNES tout en AYANT des filtres de groupes
Résultat
Plus de détails, veuillez consulter
https://dba.stackexchange.com/questions/57445/use-of-having-without-group-by-in-sql-queries/57453
Oui, Nous pouvons écrire la requête SQL sans Group by, mais écrire la fonction d'agrégation
dans notre requête.