1
votes

problème lors de l'utilisation de la clause union avec ordre par

En plaçant l'union entre deux instructions, il génère une erreur. Le code est donné ci-dessous:

J'ai essayé de placer les crochets commençant à l'instruction select et se terminant à order by name. Mais rien ne fonctionne pour moi. Quelqu'un peut-il s'il vous plaît suggérer ce qui ne va pas avec ce code?

select TOP(1) name from hack
where len(name) in (select max(len(name)) from hack )
order by name

UNION

select TOP(1) name from hack
where len(name) in (select min(len(name)) from hack )
order by name

Réception de l'erreur mentionnée ci-dessous:

Syntaxe incorrecte à côté du mot clé "UNION".


3 commentaires

Utilisez-vous SQL Server? Je suppose que vous avez besoin de sous-requêtes pour impliquer ORDER BY.


Oui, j'utilise SQL Server. L'ajout d'une sous-requête fonctionne pour moi. Merci :)


si vous supprimez le premier ordre par nom juste avant l'Union; vous n'obtiendrez plus d'erreur et votre requête donnera le jeu de résultats attendu dont vous avez besoin. S'il vous plaît lire sur "l'ordre d'exécution des requêtes" (indice pourquoi vous pouvez utiliser l'alias de colonne dans l'ordre par clause).


3 Réponses :


0
votes

Vous devez utiliser des sous-requêtes:

select name
from   (
         select TOP(1) name 
         from hack 
         where len(name) in (select max(len(name)) from hack )
         order by name
      ) A

UNION

select name
from   (
         select TOP(1) name 
         from hack 
         where len(name) in (select min(len(name)) from hack )
         order by name
      ) B


1 commentaires

Merci HoneyBadger. Ceci est vraiment utile. Je voulais juste savoir ce qui vous oblige à imbriquer une autre requête.



1
votes

Le n'est pas nécessaire:

select h.*
from (select top (1) name
       from hack h
       order by len(name), name asc
     ) h
union all
select h.*
from (select top (1) name
       from hack h
       order by len(name) desc, name
     ) h;


2 commentaires

J'ai essayé cette requête. Mais que faire s'il y a deux noms de même longueur. L'un commence par «a» et l'autre par «m». Donc, dans ce cas, la requête doit afficher le nom commençant par «a», mais après l'exécution de cette requête, elle affiche le nom avec «m». Pouvez-vous s'il vous plaît me faire savoir comment je peux modifier cette requête pour de meilleurs résultats?


@ user11497433. . . Ajoutez simplement une deuxième clé à la commande par .



0
votes

Accéder à la table une seule fois:

SELECT a.Name
FROM (
    SELECT h.Name
        ,ROW_NUMBER()OVER(ORDER BY LEN(h.Name) DESC, h.Name) AS [rnMax]
        ,ROW_NUMBER()OVER(ORDER BY LEN(h.Name) ASC, h.Name) AS [rnMin]
    FROM hack h
) a
WHERE (a.rnMin = 1 OR a.rnMax = 1)
GROUP BY a.Name
ORDER BY a.Name
;


0 commentaires