web-dev-qa-db-fra.com

SQL: comment utiliser UNION et le commander avec une sélection spécifique?

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 correct de lignes, comme: 1,4,2,3.

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

Comment puis-je faire ceci?

(J'utilise Oracle)

21
Topera

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

J'utilise GROUP BY et COUNT . J'ai essayé d'utiliser DISTINCT avec ORDER BY mais le message d'erreur suivant s'affiche: "pas une expression sélectionnée"

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 ceci blog.

5
Topera

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 joignez les ID, ce qui signifie que si vous avez 1 dans les deux tables, vous n'obtenez qu'une seule occurrence. Si tel est le comportement souhaité, vous devriez vous en tenir à UNION. Sinon, passez à UNION ALL.

Donc, je remarque également que si vous modifiez le code que j'ai proposé, vous obtiendrez à la fois 1 et 2 (de a et b). Dans ce cas, vous pouvez modifier le code proposé en:

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
28
Adrian Carneiro

@ 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. "UNION ALL" combine les 2 jeux. Un "UNION" est une perte de temps car les 2 jeux ne peuvent pas être identiques, car le champ ordonné est différent.
  2. Le "groupe par" élimine alors les doublons
  3. "Order by min (order)" assure que les éléments du tableau b sont les premiers

Cela résout tous les cas, même lorsque le tableau b contient plusieurs éléments ou des éléments différents, puis le tableau a

3
rvheddeg

@ La réponse d'Adrian convient parfaitement, je voulais simplement partager un autre moyen 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;
1
Allan
SELECT id, 1 AS sort_order
  FROM b
UNION
SELECT id, 2 AS sort_order
  FROM a
MINUS
SELECT id, 2 AS sort_order
  FROM b
ORDER BY 2;
0
onedaywhen