Comment exécuter une UNION sans tri? (SQL)
UNION
joint deux résultats et supprimer les doublons, tout en UNION ALL
ne supprime pas les doublons.
UNION
également trier la sortie finale.
Ce que je veux, c'est la UNION ALL
sans doublons et sans les trier. Est-ce possible?
La raison pour cela est que je veux que le résultat de la première requête pour être sur du résultat final, et la deuxième requête au fond (et chaque triés comme s'ils étaient exécutés individuellement).
- Ce SQL vendeur est-ce? Je ne pense pas que la norme exige
UNION ALL
sortes de rien - en réalité, le fait de ne pas trier généralement ce qui en fait un meilleur choix que la plaineUNION
- C'est ce que l'OP a dit (bien que dans un fatras d'ordre). Il veut faire une UNION, mais pas les implicites de tri.
- Vous êtes de droite. J'ai mal lu la question.
- Ce n'
UNION ALL without duplicates
veux dire? Que faire si quelque chose apparaît dans les deux ensembles de résultats? Il doit être supprimé à partir du haut, du bas ou aucun des deux? - Je vois votre point de vue. La première requête doit avoir "la priorité", de sorte que les doublons doivent être retirés à partir du bas
Vous devez vous connecter pour publier un commentaire.
Je remarque que cette question reçoit beaucoup de points de vue, donc je vais d'abord aborder une question vous n'a pas demander!
Concernant le titre. Pour parvenir à une "Union de Sql Tous avec “distinct" il suffit ensuite de remplacer
UNION ALL
avecUNION
. Cela a pour effet de supprimer les doublons.Pour votre question spécifique, compte tenu de la clarification "La première requête doit avoir "la priorité", de sorte que les doublons doivent être retirés à partir du bas", vous pouvez utiliser
"De l'UNION également trier la sortie finale" - seulement comme une mise en œuvre de l'artefact. Il est par pas les moyens garanti pour effectuer le tri, et si vous avez besoin d'un particulier de l'ordre de tri, vous devez le spécifier avec un
ORDER BY
clause. Sinon, l'ordre de sortie est ce que c'est plus pratique pour le serveur.En tant que tel, votre demande pour une fonction qui effectue un
UNION ALL
mais qui supprime les doublons est facile - il est appeléUNION
.De vos éclaircissements, vous aussi vous semblent croire qu'un
UNION ALL
sera de retour à tous les résultats de la première requête avant que les résultats des requêtes ultérieures. C'est aussi pas garanti. Encore une fois, le seul moyen de parvenir à un ordre particulier est de le spécifier à l'aide d'unORDER BY
clause.Mais la vraie réponse est: autres que le
ORDER BY
clause, l'ordre de tri par arbitraires et ne sont pas garantis.Tenir compte de ces tables (Standard SQL code s'exécute sur le Serveur SQL server 2008):
L'effet désiré est-ce à table de tri
A
parcol
croissant, tri de la tableB
parcol
décroissant puis fusion les deux, en supprimant les doublons, en conservant l'ordre avant l'union et de quitter la tableA
résultats sur le "haut" avec le tableauB
sur le "bas" par exemple (pesudo code)Bien sûr, cela ne fonctionne pas dans SQL, car il ne peut être une
ORDER BY
clause et elle ne peut être appliquée à haut niveau d'expression de table (ou quelle que soit la sortie d'unSELECT
requête est appelé; je l'appelle le "resultset").La première chose à aborder est l'intersection entre les deux tables, dans ce cas, les valeurs
4
,5
et6
. Comment l'intersection doivent être triés doit être spécifié dans le code SQL, il est donc souhaitable que le concepteur spécifie aussi! (c'est à dire la personne qui pose la question, dans ce cas).L'implication dans ce cas semble être celui de l'intersection ("doublons") doivent être triés dans les résultats de tableau A. par conséquent, le tri resultset devrait ressembler à ceci:
Note dans SQL "haut" et "bas" n'a pas de inferent sens et une table (autres que les resultset) n'a pas inhérente à la commande. Aussi (pour couper une longue histoire courte) considèrent que
UNION
supprime les lignes en double par implication et doit être appliquée avantORDER BY
. La conclusion doit être que chaque tableau de l'ordre de tri doivent être explicitement définis en exposant un ordre de tri de la colonne(s) avant être réunies. Pour cela, nous pouvons utiliser leROW_NUMBER()
fenêtré, par exemple,Essayez ceci:
Le tri est utilisé pour éliminer les doublons, et qu'il est implicite pour
DISTINCT
etUNION
requêtes (mais pasUNION ALL
) - vous pouvez toujours spécifier les colonnes que vous préférez commander par si vous avez besoin de les trier par des colonnes spécifiques.Par exemple, si vous souhaitez trier par les jeux de résultats, vous pouvez introduire une colonne supplémentaire, et de les trier par la première:
Je suppose que vos tables table1 et table2 respectivement,
et votre solution est;
EXCEPT
plutôt que d'OracleMINUS
mais ce n'est pas la correction 🙂1,1:
select 1 from dual
union all select 1 from dual
1:
select 1 from dual
union select 1 from dual
Vous pouvez faire quelque chose comme cela.