Erreur SQL avec la Commande Par la sous-Requête
Je travaille avec SQL Server 2005.
Ma requête est:
SELECT (
SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
Et l'erreur:
La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, dérivé
des tables, des sous-requêtes, et les expressions de table communes, à moins d'en HAUT, et POUR
XML est également spécifié.
Comment puis-je utiliser ORDER BY
dans une sous-requête?
Vous devez vous connecter pour publier un commentaire.
C'est l'erreur que vous (l'emphase est mienne):
Alors, comment pouvez-vous éviter l'erreur? Par la spécification de HAUT, serait une possibilité, je suppose.
TOP 100 PERCENT
. Mais merci pour l'astuce, je ne savais pas que.Outre le fait que la commande par ne semble pas donner un sens à votre requête....
Pour utiliser order by dans une sous-sélection, vous aurez besoin d'utiliser des 2147483647.
Ma compréhension est que les "TOP 100 pour CENT" n'a pas de garantie de la commande de plus à partir de SQL 2005:
Voir SQL Server 2005 dernières modifications
Espère que cette aide,
Patrick
Si vous travaillez avec SQL Server 2012 ou plus tard, c'est maintenant facile à corriger. Ajouter un
offset 0 rows
:Vous n'avez pas besoin d'ordre dans votre sous-requête. Déplacez-le dans la requête principale, et d'inclure la colonne que vous souhaitez commander dans la sous-requête.
cependant, votre question est tout simplement rentrer un nombre, donc je ne vois pas l'intérêt de la commande par.
Ajouter la commande en Haut de votre sous-requête...
🙂
peut-être que cette astuce va aider quelqu'un
ici sous-requête interne commandé par le champ created_at (peut être à tout à partir de votre tableau)
Dans cet exemple, la commande n'ajoute pas de l'information - le COMTE d'un ensemble est la même quelle que soit la commande est en!
Si vous avez été de choisir quelque chose que ne dépendent de l'ordre, vous devez faire l'une des choses les message d'erreur vous indique - TOP ou POUR XML
Une sous-requête (affichage imbriqué) que vous avez, il retourne un dataset que vous pouvez ensuite commander votre appel de requête. La commande de la sous-requête se fera pas (fiable) différence à l'ordre des résultats de votre requête.
Comme pour votre SQL lui-même:
a) j'ai vu aucune raison pour une commande de vous retourner qu'une seule valeur.
b) je ne vois aucune raison pour la sous-requête de toute façon comme vous ne sont que de retourner une valeur unique.
Je devine qu'il y a beaucoup plus d'informations que vous pourriez nous dire dans le but de résoudre le problème que vous avez.
Essayez de déplacer la clause order by à l'extérieur sous de sélectionner et d'ajouter la commande par champ de sous-sélection
Pour moi cette solution fonctionne très bien ainsi:
Si la construction d'une table temporaire, déplacer la clause ORDER BY à partir de l'intérieur de la table temp bloc de code à l'extérieur.
Pas permis:
Permis:
Bonne journée
pour certains gars de la commande par la sous-requête est discutable.
la commande par la sous-requête est un must à utiliser si vous avez besoin de supprimer certains enregistrements sur la base de certains de tri.
comme
de sorte que vous pouvez supprimer la dernière insertion de la forme de la table.
il y a trois façon de le faire de cette suppression, en fait.
toutefois, l'ordre par la sous-requête peut être utilisée dans de nombreux cas.
pour la suppression des méthodes qu'utilise l'ordre par la sous-requête d'examen ci-dessous le lien
http://web.archive.org/web/20100212155407/http://blogs.msdn.com/sqlcat/archive/2009/05/21/fast-ordered-delete.aspx
j'espère que cela aide. merci à vous tous
J'Utilise Ce Code Pour Obtenir Le Meilleur Deuxième Salaire
Je suis Également d'Erreur Comme
La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, sous-requêtes, et les expressions de table communes, à moins d'en HAUT, et POUR XML est également spécifié.
TOP 100, j'ai Utilisé Pour Éviter L'Erreur
select * from (
sélectionnez la ville.Coloumn1 ,CONVERT(varchar, ROW_NUMBER() OVER (ORDER BY (SÉLECTIONNEZ 1))) COMME Rowno de (
sélectionnez top 100 * from Table1
commande par Coloumn1 desc) comme tbl) en tant que tbl où tbl.Rowno=2
Pour un simple comptage comme l'OP est affiché, la Commande par n'est pas strictement nécessaire. Si ils sont en utilisant le résultat de la sous-requête, il peut être. Je suis en train de travailler sur un problème similaire et j'ai obtenu le même message d'erreur dans la requête suivante:
-- Je veux les lignes de la table des coûts, avec un updateddate égal au max updateddate:
-- *** Pour ce faire, il ya quelques options:
-- Ajouter un parasite clause TOP, Cela semble être un peu un hack:
-- **** Créer une table temporaire pour commander le maxCost
D'autres solutions possibles pourrait être la CTE ou d'un tableau de variables. Mais chaque situation exige de vous de déterminer ce qui fonctionne le mieux pour vous. J'ai tendance à chercher d'abord vers une table temp. Pour moi, c'est simple et clair. YMMV.
Sur les éventuels besoins à l'ordre d'une sous-requête est lorsque vous avez une UNION :
Vous générer un appel livre de tous les enseignants et les étudiants.
Vous voulez l'afficher avec tous les enseignants en premier, suivi par tous les étudiants, à la fois ordonnée par. Si vous ne pouvez pas appliquer un ordre mondial par.
Une solution est d'inclure une touche de force de premier ordre, et ensuite commander les noms :
Je pense que sa façon de plus en plus clair que les faux compensation de la sous-requête résultat.