92 votes

supprimer les doublons d'une union sql

Je fais un peu de sql de base sur quelques tables que j'ai, en utilisant une union (à tort ou à raison).

mais je dois supprimer les doublons. Avez-vous des idées ?

select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4 
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4

219voto

Randy Minder Points 19262

Union supprimera les doublons. Union All ne le fait pas.

6voto

jelbourn Points 890

Utilisation de UNION supprime automatiquement les lignes dupliquées, sauf si vous spécifiez UNION ALL : http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx

4voto

Alberto Martinez Points 854

Puisque vous obtenez toujours un doublon en utilisant seulement UNION Je vérifierais ça :

  • Qu'ils sont des copies exactes. Je veux dire, si vous faites un

    SELECT DISTINCT * FROM (<your query>) AS subquery

    vous obtenez moins de fichiers ?

  • Que vous n'avez pas déjà les doublons dans la première partie de la requête (peut-être générés par la jointure gauche). Si je comprends bien UNION il n'ajoutera pas au jeu de résultats les lignes qui s'y trouvent déjà, mais il ne supprimera pas les doublons déjà présents dans le premier jeu de données.

4voto

Jerry Coffin Points 237758

D'autres ont déjà répondu à votre question directe, mais peut-être pourriez-vous simplifier la requête pour éliminer la question (ou ai-je manqué quelque chose, et une requête comme la suivante produira vraiment des résultats sensiblement différents ?)

select * 
    from calls c join users u
        on c.assigned_to = u.user_id 
        or c.requestor_id = u.user_id
    where u.dept = 4

2voto

Justin Rassier Points 434

Si vous utilisez T-SQL, il semble, d'après les messages précédents, que UNION supprime les doublons. Mais si vous ne l'utilisez pas, vous pouvez utiliser distinct. Cela ne me semble pas tout à fait correct non plus, mais cela pourrait vous permettre d'obtenir le résultat que vous recherchez.

SELECT DISTINCT *
FROM
(
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4 
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
)a

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X