19 March 2015

Differenza tra UNION e UNION ALL

UNION
- è come un SELECT DISTINCT, quindi elimina i doppioni
- fa un ORDER BY dei record

UNION ALL
- lascia i doppioni
- mantiene l'ordine originale dei record

Creo due tabelle con la stessa struttura e le riempio:
DECLARE @a as table (a int, b varchar(10))
INSERT  @a (a, b) SELECT 20, 'bla'
INSERT @a (a, b) SELECT 10, 'foo'

DECLARE @b as table (a int, b varchar(10))
INSERT @b (a, b) SELECT 20, 'bla'

SELECT * FROM @a
SELECT * FROM @b
Risultati:
a           b
----------- ----------
20          bla
10          foo

a           b
----------- ----------
20          bla

UNION:
SELECT * FROM @a
UNION
SELECT * FROM @b
Risultati:
a           b
----------- ----------
10          foo
20          bla

UNION ALL:
SELECT * FROM @a
UNION ALL
SELECT * FROM @b
Risultati:
a           b
----------- ----------
20          bla
10          foo
20          bla

Dimostrazione che la UNION ALL è una DISTINCT:
SELECT DISTINCT *
FROM (
   SELECT * FROM @a
   UNION ALL
   SELECT * FROM @b
  ) as x
Risultati:
a           b
----------- ----------
10          foo
20          bla


Trovato qui...

... e qui.