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)
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.
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
@ 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:
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
@ 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;
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;