UNION filtra entradas duplicadas enquanto UNION ALL mantém duplicatas. Semelhante a esse cenário, considere este caso anológico, quero definir a união para verificar apenas a duplicação de coluna única.
SELECT id, 1 AS category FROM users UNION SELECT id, 2 FROM users_2;
Aqui eu quero rejeitar todas as entradas UNION id, 2
e verificar a duplicação com base apenas em id .
RESULTADO:
id | category
------------------
100 | 1
101 | 1
... | ...
100 | 2 # Skip this as 100 is already present
201 | 2
....
ESPERADO:
id | category
----------------
100 | 1
101 | 1
... | ...
201 | 2
full outer join
é muito útil para isso da seguinte forma:Como isso funciona é que a
id
coluna seránull
se a linha vier deusers
enquanto não será nula quando estiver vindo deusers_2
.Alternativamente, você pode fazer isso com
union
(e usarunion all
porque já estamos usandonot exists
para descartar duplicatas):mas como você pode ver a consulta se torna muito mais longa.
Uma terceira maneira que é ainda mais longa e provavelmente ainda menos eficiente é usar
distinct on
:NB Esta última consulta garante a ordem na saída; as duas primeiras consultas não!
Veja https://dbfiddle.uk/?rdbms=postgres_13&fiddle=dd8bdbc82edc26cce9e8ba9fdde84517