1706 Stimmen

Was ist der Unterschied zwischen UNION und UNION ALL?

Was ist der Unterschied zwischen UNION y UNION ALL ?

1 Stimmen

1 Stimmen

Union all enthält alle ids in der linken und rechten tabelle. wobei union eindeutige ids in der linken und rechten tabelle enthält. union all erlaubt doppelte ids. union funktioniert wie set in python und erzeugt eindeutige ids

26voto

DotNetGuy Punkte 399

UNION
Die UNION Befehl wird verwendet, um verwandte Informationen aus zwei Tabellen auszuwählen, ähnlich wie der JOIN Befehl. Wenn Sie jedoch den Befehl UNION Befehl müssen alle ausgewählten Spalten vom gleichen Datentyp sein. Mit UNION werden nur eindeutige Werte ausgewählt.

UNION ALL
Die UNION ALL ist gleich dem Befehl UNION Befehl, mit der Ausnahme, dass UNION ALL wählt alle Werte aus.

Der Unterschied zwischen Union y Union all ist das Union all eliminiert keine doppelten Zeilen, sondern zieht einfach alle Zeilen aus allen Tabellen, die Ihren Abfragespezifikationen entsprechen, und kombiniert sie in einer Tabelle.

A UNION Anweisung macht effektiv eine SELECT DISTINCT auf die Ergebnismenge. Wenn Sie wissen, dass alle zurückgegebenen Datensätze aus Ihrer Vereinigung eindeutig sind, verwenden Sie UNION ALL stattdessen liefert sie schnellere Ergebnisse.

17voto

Ihor Vorotnov Punkte 1468

Sie können Duplikate vermeiden und trotzdem viel schneller als UNION DISTINCT (was eigentlich dasselbe ist wie UNION) laufen, indem Sie die Abfrage wie folgt ausführen:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Beachten Sie die AND a!=X Teil. Dies ist viel schneller als UNION.

9 Stimmen

Dadurch werden Zeilen ausgelassen und daher nicht das erwartete Ergebnis erzielt, wenn a NULL-Werte enthält. Außerdem wird immer noch nicht dasselbe Ergebnis geliefert wie bei einer UNION - UNION entfernt auch Duplikate, die von den Unterabfragen zurückgegeben werden, während Ihr Ansatz dies nicht tut.

0 Stimmen

@FrankSchmitt - danke für diese Antwort; dieser Teil über Unterabfragen ist genau das, was ich wissen wollte!

16voto

Peter Perháč Punkte 20034

Nur um meine Meinung zu dieser Diskussion zu äußern: Man könnte die UNION Operator als reine, SET-orientierte UNION - z.B. Menge A={2,4,6,8}, Menge B={1,2,3,4}, A UNION B = {1,2,3,4,6,8}

Wenn es um Mengen geht, möchte man nicht, dass die Zahlen 2 und 4 zweimal vorkommen, entweder als ein Element es o ist nicht in einem Satz.

In der Welt von SQL möchte man aber vielleicht alle Elemente aus den beiden Mengen zusammen in einer "Tasche" {2,4,6,8,1,2,3,4} sehen. Und für diesen Zweck bietet T-SQL den Operator UNION ALL .

3 Stimmen

Kleiner Fehler: UNION ALL wird von T-SQL nicht "angeboten". UNION ALL ist Teil des ANSI SQL-Standards und nicht spezifisch für MS SQL Server.

3 Stimmen

Der "Nitpick"-Kommentar könnte implizieren, dass man "Union All" in TSQL nicht verwenden kann, aber das kann man. Natürlich bedeutet der Kommentar nicht sagen aber jemand, der es liest, kann es daraus schließen.

13voto

DBA Punkte 303

UNION - führt zu deutlich Datensätze

während

UNION ALL - ergibt alle Datensätze einschließlich der Duplikate.

Beide sind blockierende Operatoren und daher bevorzuge ich persönlich die Verwendung von JOINS gegenüber blockierenden Operatoren (UNION, INTERSECT, UNION ALL usw.) jederzeit.

Um zu veranschaulichen, warum die Operation Union im Vergleich zu Union All schlecht abschneidet, sehen Sie sich das folgende Beispiel an.

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'

CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

enter image description here

Es folgen die Ergebnisse der Operationen UNION ALL und UNION.

enter image description here

Eine UNION-Anweisung führt effektiv ein SELECT DISTINCT auf die Ergebnismenge aus. Wenn Sie wissen, dass alle von Ihrer Vereinigung zurückgegebenen Datensätze eindeutig sind, verwenden Sie stattdessen UNION ALL, da dies schnellere Ergebnisse liefert.

Die Verwendung von UNION führt zu Unterschiedliche Sortierung Operationen im Ausführungsplan. Der Beweis für diese Aussage ist unten dargestellt:

enter image description here

3 Stimmen

Alles in dieser Antwort wurde bereits gesagt, ist zu verwirrend, um nützlich zu sein (Joins gegenüber Unions vorschlagen, obwohl sie unterschiedliche Dinge tun, "Blocking" als Grund angeben, ohne zu erklären, was Sie damit meinen oder auf welche Datenbankserver das zutrifft), oder ist höchst irreführend (Ihre Prozentsätze in Ihrem Screenshot sind nicht auf die tatsächliche Verwendung von UNION / UNION ALL ).

0 Stimmen

Blocking Operators sind in TSQL wohlbekannte Operatoren. Alles, was blockierende Operatoren tun, kann durch Joins erreicht werden, aber nicht umgekehrt. Die Operation Distinct Sort ist im Bild eingekreist, um zu verdeutlichen, warum union all besser abschneidet als union und um genau zu zeigen, wo sie im Ausführungsplan vorhanden ist. Fügen Sie ruhig weitere Daten zu den Tabellen T1 und T2 hinzu, um mit den Prozentsätzen zu spielen!

0 Stimmen

Sie KÖNNEN technisch die Ergebnisse einer union unter Verwendung einer Kombination aus join s und einige wirklich böse case s, aber es macht die Abfrage fast unmöglich zu lesen und zu pflegen, und meiner Erfahrung nach ist es auch schrecklich für die Leistung. Vergleichen Sie: select foo.bar from foo union select fizz.buzz from fizz gegen select case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null

11voto

Jakub Šturc Punkte 33925

Es ist nicht sicher, ob es wichtig ist, welche Datenbank

UNION y UNION ALL sollte auf allen SQL-Servern funktionieren.

Unnötiges sollten Sie vermeiden UNION s sind sie ein riesiges Leistungsloch. Als Faustregel gilt UNION ALL wenn Sie nicht sicher sind, welche Sie verwenden sollen.

1 Stimmen

Es gibt kein SQL Server-Tag für diese Frage. Ich denke, dass die Option, die Duplikate zurückgibt, nur weil es gewöhnlich am besten funktioniert, der falsche Rat ist.

3 Stimmen

@onedaywhen Ich vermute, dass der OP den Begriff "SQL Server" als Synonym für alle RDBMS (z.B. MySQL, PostGreSQL, Oracle, SQL Server) verwendet hat. Die Formulierung ist allerdings unglücklich (und natürlich kann ich mich irren).

1 Stimmen

@FrankSchmitt: keines der von Ihnen aufgeführten Produkte ist ein echtes RDBMS :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X