À l'aide distinctes sur une colonne et faire commande par sur une autre colonne donne une erreur
J'ai une table:
abc_test avec des colonnes n_num, k_str.
Cette requête ne fonctionne pas:
select distinct(n_num) from abc_test order by(k_str)
Mais celui-ci fonctionne:
select n_num from abc_test order by(k_str)
Comment DISTINCTES et de l'ORDRE, PAR mots clés, en interne, que la sortie des deux requêtes est changé?
Pourriez-vous montrer le résultat si vous exécutez ces deux requêtes? La première requête doit renvoyer une erreur
Même effet sur SQL Server, mais avec un message d'erreur plus descriptif, "COMMANDE PAR éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié."
ORA-01791: not a SELECTed expression
comme le k_str
colonne n'est pas sélectionné. Est-ce le réel de la requête que vous avez exécuté? (Il peut être acceptable dans 9i, mais je ne peux pas en être sûr.)Même effet sur SQL Server, mais avec un message d'erreur plus descriptif, "COMMANDE PAR éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié."
OriginalL'auteur prateek gupta | 2012-01-18
Vous devez vous connecter pour publier un commentaire.
Que j'ai compris de ta question .
distinctes :- les moyens select distinct(toutes les valeurs sélectionnées doit être unique).
commande Par :- signifie simplement à l'ordre les lignes sélectionnées selon vos besoins .
Le problème dans votre première requête est
Par exemple :
J'ai une table
maintenant la requête
select distinct(ID) from table order by (name)
est confus qui enregistrement il devrait prendre pour ID - 04 (depuis deux valeurs sont là,d et un Nom de colonne). Donc, le problème pour le moteur de base est ici quand vous ditescommande par (nom de).........
OriginalL'auteur Abhishek Bhandari
Vous pouvez penser à l'aide de groupe par la place:
Qu'entendez-vous par là? J'ai juste essayé la requête, et pour moi, il semble que cela fonctionne.
heeeei, vous avez édité votre question.
order by min(k_str)
est une chose différente queorder by k_str
Oui, le min(..) la partie qui manque à ma première réponse. M'en excuse.
OriginalL'auteur Nils Magne Lunde
La première requête est impossible.
Permet d'expliquer le présent par exemple. nous avons de ce test:
select distinct (n_num) from abc_test
estSelect n_num from abc_test order by k_str
estQue voulez-vous retourner
select distinct (n_num) from abc_test order by k_str
?il doit retourner à seulement 1 et 2, mais comment faire pour les commander?
select distinct (n_num) as iresult from abc_test ORDER BY iresult ASC
Sûr qu'il peut commander par la première colonne. L'OP était sur le pourquoi de cette requête ne fonctionne pas. Ce que vous dites peut être simplement:
select distinct n_num from abc_test order by 1
"comment commander?" -- Je ne peux penser à des approches possibles: tous arbitrairement; condamner sans ambiguïté les valeurs dans l'ordre puis l'ambiguïté dans arbitrairement; etc. Mais je soupçonne plutôt un point de perdu sur moi!
Si toutes les valeurs pour
n_num
sont distincts dans le tableau, le message d'erreur se produisent encore? Si oui, est-ce le changement de vos conclusions?il n'est pas difficile à comprendre: pour les 1 vous avez. b. pour 2 vous avez un c. Ce qui est premier? 1 ou 2? 🙂
OriginalL'auteur Florin Ghita
Vous sélectionnez la collecte nette(n_num) depuis le jeu de résultats de votre requête. Donc, il n'y a pas de réel rapport avec la colonne k_str plus. Un n_num peut être de deux lignes ayant chacune une valeur différente pour k_str. Si vous ne pouvez pas commander la collection distinct(n_num) par k_str.
OriginalL'auteur Robert Merkwürdigeliebe
Selon les Normes SQL, un
SELECT
clause peut se référer soit à des clauses ("alias") dans le haut niveauSELECT
clause ou des colonnes du jeu de résultats en position ordinale, et donc du néant de vos requêtes seraient conformes.Il semble Oracle, en commun avec d'autres SQL implemetations, vous permet de consulter les colonnes qui existait (logiquement) immédiatement avant d'être projeté au loin, dans la
SELECT
clause. Je ne suis pas sûr de savoir si une telle souplesse est une bonne chose: de l'OMI, il est de bonne pratique pour exposer l'ordre de tri à l'appel de l'application par y compris la colonne/expressions, etc dans leSELECT
clause.Que jamais, vous avez besoin d'appliquer dsicpline pour obtenir des résultats significatifs. Pour votre première question, la définition de la commande est potentiellement tout à fait arbitraire.Vous devriez être reconnaissants pour l'erreur 😉
OriginalL'auteur onedaywhen
Cette approche est disponible dans SQL server 2000, vous pouvez sélectionner les valeurs distinctes d'une table et commande par différents colonne qui n'est pas inclus dans Distincts.
Mais dans SQL 2012 ce sera grâce à vous une erreur
"COMMANDE PAR éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié."
Donc, si vous voulez utiliser la même fonctionnalité de SQL 2000, vous pouvez utiliser le numéro de colonne de la commande(ce n'est pas recommandé dans les meilleures pratiques).
Ce sera de l'ordre de la première colonne après récupérer le résultat. Si vous souhaitez que la commande doit être faite en se basant sur différents colonne autre que distinctes, alors vous devez ajouter cette colonne également dans l'instruction select et l'utilisation de la colonne numéro de commande par.
OriginalL'auteur Shiva N
Comment étendue de la clé de tri des colonnes
La l'ordre logique des opérations dans SQL pour votre première requête, est (simplifié):
FROM abc_test
SELECT n_num, k_str
c'est à dire ajouter un soi-disant étendue de la clé de tri de la colonneORDER BY k_str DESC
SELECT n_num
c'est à dire supprimer la étendue de la clé de tri de la colonne de nouveau à partir du résultat.Grâce à la norme SQL étendue de la clé de tri de la colonne fonctionnalité, il est possible de commander par quelque chose qui n'est pas dans le
SELECT
clause, car il est temporairement ajouté derrière les coulisses avant de commander, puis retiré après la commande.Alors, pourquoi n'est-il pas travailler avec
DISTINCT
?Si l'on ajoute les
DISTINCT
opération, il devra être ajouté entreSELECT
etORDER BY
:FROM abc_test
SELECT n_num, k_str
c'est à dire ajouter un soi-disant étendue de la clé de tri de la colonneDISTINCT
ORDER BY k_str DESC
SELECT n_num
c'est à dire supprimer la étendue de la clé de tri de la colonne de nouveau à partir du résultat.Mais maintenant, avec les étendue de la clé de tri de la colonne
k_str
, la sémantique de l'DISTINCT
opération a été modifié, de sorte que le résultat ne sera plus le même. Ce n'est pas ce que nous voulons, donc, à la fois à la norme SQL, et toutes les mesures raisonnables et les bases de données d'interdire cette utilisation.Solutions de contournement
PostgreSQL a la
DISTINCT ON
syntaxe, qui peut être utilisé ici, précisément pour cette tâche:Il peut être émulée avec la syntaxe standard comme suit, si vous n'êtes pas l'utilisation de PostgreSQL
Ou, tout simplement (dans ce cas)
J'ai blogué sur SQL DISTINCTES et COMMANDE PAR plus en détail ici.
OriginalL'auteur Lukas Eder
avez-vous essayé?
OriginalL'auteur John Woo
vous pouvez faire
OriginalL'auteur zengse
Quand j'ai eu la même erreur, je l'ai résolu en modifiant comme
OriginalL'auteur gjijo