Entfernen Sie Duplikate aus SQL Union

70

Ich mache einige grundlegende SQL-Anweisungen für einige Tabellen, die ich habe, unter Verwendung einer Union (zu Recht oder zu Unrecht).

aber ich muss die Duplikate entfernen. Irgendwelche Ideen?

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
Der Schießer
quelle
1
Wollen Sie damit sagen, dass Ihre Abfrage keine Duplikate entfernt?
Yada

Antworten:

178

Unionentfernt Duplikate. Union Allnicht.

Randy Minder
quelle
3
Dies gilt zumindest für MS SQL.
TarasB
3
Interessant ... entfernt nicht die Duplikate auf der obigen Aussage
thegunner
2
@thegunner - Haben Sie zufällig einen Zeitstempeldatentyp als eine Ihrer Spalten?
Randy Minder
4
@thegunner - Union entfernt tatsächlich Duplikate. Ich würde die Auswahl * aus beiden Abfragen entfernen und Spalten nacheinander manuell zu beiden hinzufügen, bis Sie einen Fall finden, in dem Sie glauben, dass ein Duplikat auftritt. Wenn Sie einen finden, welchen Datentyp haben Sie?
Randy Minder
3
tatsächlich - auf den zweiten Blick wurden einige Spalten hinzugefügt, in denen ich nicht war; Erwartung, die die Zeilen einzigartig macht. Ich werde mir die Abfrage noch einmal ansehen - danke.
Thegunner
5

Durch die UNIONautomatische Verwendung werden doppelte Zeilen automatisch entfernt, sofern Sie nicht Folgendes angeben UNION ALL: http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx

Jeremy Elbourn
quelle
1
Umfasst dies doppelte Zeilen, die von einer der "vereinigten" Abfragen zurückgegeben werden?
Zach Smith
4

Andere haben Ihre direkte Frage bereits beantwortet, aber vielleicht könnten Sie die Abfrage vereinfachen, um die Frage zu beseitigen (oder habe ich etwas verpasst, und eine Abfrage wie die folgende führt wirklich zu erheblich anderen Ergebnissen?):

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
Jerry Sarg
quelle
Beachten Sie, dass OR in einem Join einen Tabellenscan verursacht, keine ideale Lösung
Salar
2

Wenn Sie T-SQL verwenden, scheint es, dass UNION aus früheren Beiträgen Duplikate entfernt. Aber wenn Sie nicht sind, könnten Sie verschiedene verwenden. Das fühlt sich für mich auch nicht ganz richtig an, aber es könnte Ihnen das Ergebnis bringen, das Sie suchen

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
Justin Rassier
quelle
Das funktioniert bei meinem Fall nicht. Ich habe noch 2 Spalten mit den gleichen Daten
lone_coder
2

Da Sie immer noch nur mit Duplikaten arbeiten, UNIONwürde ich Folgendes überprüfen:

  • Dass es sich um exakte Duplikate handelt. Ich meine, wenn du eine machst

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

    Sie bekommen weniger Dateien?

  • Dass Sie nicht bereits die Duplikate im ersten Teil der Abfrage haben (möglicherweise durch den linken Join generiert). Soweit ich weiß UNION, werden die bereits vorhandenen Zeilen der Ergebnismenge nicht hinzugefügt, es werden jedoch keine Duplikate entfernt, die bereits im ersten Datensatz vorhanden sind.

Alberto Martinez
quelle
2
Zumindest T-SQL entfernt alle Duplikate, auch wenn sie aus demselben Datensatz stammen.
Carlos
0

Wenn Sie T-SQL verwenden, können Sie eine temporäre Tabelle in einer gespeicherten Prozedur verwenden und die Datensätze Ihrer Abfrage entsprechend aktualisieren oder einfügen.

Joe Gurria Celimendiz
quelle
Bitte stellen Sie sicher, dass Ihre Antwort weitere Details enthält. Wenn Sie auf etwas verweisen möchten, können Sie Kommentare verwenden
Abdulrahman Falyoun