Raison pour ORDRE PAR les éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié
Je sais que la requête ci-dessous les causes de l'erreur - COMMANDE PAR éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié.
SELECT DISTINCT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
ORDER BY birthdate;
Quelle est la raison ? Ce qui se passe réellement ? Si je n'utilise pas DISTINCTS ou simplement d'ajouter la date de naissance de SÉLECTIONNER ou de la COMMANDE PAR la ville, il me donne une partie de la sortie, mais pas une erreur. Est-ce parce que SELECT DISTINCT city
donne seulement un jeu de résultats avec les villes et rien d'autre ?
ÉDITION -(je pense que cela peut être une réponse à ma question)
SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
Examiner la requête ci-dessus. Pas sûr, mais je pense que c'est la façon dont il fonctionne, en coulisse, SQL Server a probablement un jeu de résultats avec toutes les colonnes, mais nous ne sommes que le montre la colonne ville que j'appellerai le "jeu affiché" . Ainsi, la commande par ville ou n'importe quelle autre colonne est valide.
Ce qui se passe dans les résultats lorsque nous utilisons SELECT DISTINCT ville à la place ? SQL server n'a pas uniquement les lignes avec les villes DISTINCTES dans son ensemble de résultats. Il a l'ensemble du jeu de résultats, comme celui généré par une requête SELECT*. Mais, il ne montre que des lignes distinctes fondées sur la ville. Peut maintenant ce jeu affiché être triées en fonction de la date de naissance ? No.
Dans une ville avec de nombreux employés, c'est à dire beaucoup de dates de naissance, SQL server ne peut pas dire qui date de naissance doit être utilisé pour la commande de l'affichage de l'ensemble. C'est pourquoi il affiche un message d'erreur.
Il peut y avoir plusieurs employés dans une ville, ainsi que la date de naissance doit-il utiliser lors de la commande de la ville?
Je suis d'accord. Mon seul doute est si DISTINCT génère un ensemble de résultats qui n'a de lignes avec les villes distinctes. Je pense que c'est l'erreur dans ma façon de penser. Alors, j'ai fait un edit à ma question. Veuillez voir et me dire si cela a du sens.
OriginalL'auteur Steam | 2013-09-03
Vous devez vous connecter pour publier un commentaire.
Une requête avec
SELECT DISTINCT
peut être réécrite en utilisantGROUP BY
. Ainsi la requête:est équivalent à:
et vous ne pouvez pas utiliser
ORDER BY birthdate
ici. La raison est la même pour les deux requêtes. Il peut y avoir de nombreux (plus d'un) des lignes avec le mêmecity
mais différentsbirthdate
. Qui doit être utilisé pour la commande (si c'est autorisé?)Toutefois, vous pouvez utiliser des fonctions d'agrégation avec un
GROUP BY
requête:Oui, je suis d'accord avec ceux-ci. Sauf pour la dernière ligne ("Dans une ville avec de nombreux collaborateurs,..."), Même si toutes les villes ont un seul employé, la requête ne serait pas autorisé. Parce que potentiellement, les nouveaux employés peuvent être insérés, c'est à dire à SQL Server ne prend pas en examiner les données réelles, mais la structure de la requête et appliquées/déclarés contraintes (et dans ce cas, pas même de ceux-ci).
Merci pour la révision et à la correction. A plus de sens maintenant.
OriginalL'auteur ypercubeᵀᴹ
OriginalL'auteur xurca