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

1
Wollen Sie damit sagen, dass Ihre Abfrage keine Duplikate entfernt?
Yada

Antworten:


178

Unionentfernt Duplikate. Union Allnicht.


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


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

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

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.