code - sql server query



SQL: comment utiliser UNION et commander par un select spécifique? (4)

En utilisant des astuces @Adrian, j'ai trouvé une solution:

J'utilise GROUP BY et COUNT . J'ai essayé d'utiliser DISTINCT avec ORDER BY mais je reçois un message d'erreur: "pas une expression SELECTed"

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3
    UNION ALL -- changed to ALL
    SELECT id FROM b -- returns 2,1
)
GROUP BY id ORDER BY count(id);

Merci Adrian et ce blog.

https://ffff65535.com

J'ai deux sélections:

SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1

Je reçois un nombre de lignes correct, comme: 1,4,2,3 .

Mais je veux d'abord b les résultats de la table: 2,1,4,3 ou 2,1,3,4

Comment puis-je faire ceci?

(J'utilise Oracle)


Vous voulez faire ceci:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

Mettre à jour

J'ai remarqué que même si vous avez deux tables différentes, vous rejoignez les ID, ce qui signifie que si vous avez 1 dans les deux tables, vous obtenez une seule occurrence. Si c'est le comportement souhaité, vous devriez vous en tenir à UNION . Sinon, passez à UNION ALL .

Donc, je remarque aussi que si vous changez le code que j'ai proposé, vous commencerez à obtenir à la fois 1 et 2 (à la fois a et b ). Dans ce cas, vous pouvez remplacer le code proposé par:

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

@ Réponse d'Adrian est parfaitement adapté, je voulais juste partager une autre façon d'atteindre le même résultat:

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;

@ La réponse d'Adrien ne fonctionne pas. Il donne un ORA-01791.

La bonne réponse (pour la question posée) devrait être:

select id
from 
 (SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
  UNION ALL
  SELECT id, 1 as ordered FROM b -- returns 2,1
  )
group by id
order by min(ordered)

Explication:

  1. Le "UNION ALL" combine les 2 sets. Un "UNION" est un gaspillage car les 2 ensembles ne peuvent pas être les mêmes, car le champ ordonné est différent.
  2. Le "groupe par" élimine alors les doublons
  3. La "commande par min (ordonnée)" assure que les éléments de la table b sont les premiers

Cela résout tous les cas, même lorsque la table b a plus ou des éléments différents puis une table





union