Pode-se combinar os resultados de duas consultas utilizando as operações de conjunto união, interseção e diferença [1] [2] [3] [4] [5] . A sintaxe é
consulta1 UNION [ALL] consulta2 consulta1 INTERSECT [ALL] consulta2 consulta1 EXCEPT [ALL] consulta2
onde consulta1 e consulta2 são consultas que podem utilizar qualquer uma das funcionalidades mostradas até aqui. As operações de conjuntos também podem ser aninhadas ou encadeadas. Por exemplo:
consulta1 UNION consulta2 UNION consulta3
significa, na verdade,
(consulta1 UNION consulta2) UNION consulta3
Efetivamente, UNION anexa o resultado da consulta2 ao resultado da consulta1 (embora não haja garantia que esta seja a ordem que as linhas realmente retornam). Além disso, são eliminadas do resultado as linhas duplicadas, do mesmo modo que no DISTINCT, a não ser que seja utilizado UNION ALL.
INTERSECT retorna todas as linhas presentes tanto no resultado da consulta1 quanto no resultado da consulta2. As linhas duplicadas são eliminadas, a não ser que seja utilizado INTERSECT ALL.
EXCEPT retorna todas as linhas presentes no resultado da consulta1, mas que não estão presentes no resultado da consulta2 (às vezes isto é chamado de diferença entre duas consultas). Novamente, as linhas duplicadas são eliminadas a não ser que seja utilizado EXCEPT ALL.
Para ser possível calcular a união, a interseção, ou a diferença entre duas consultas, as duas consultas devem ser "compatíveis para união", significando que ambas devem retornar o mesmo número de colunas, e que as colunas correspondentes devem possuir tipos de dado compatíveis, conforme descrito na Seção 10.5.
Nota: O exemplo abaixo foi escrito pelo tradutor, não fazendo parte do manual original.
Exemplo 7-5. Linhas diferentes em duas tabelas com definições idênticas
Este exemplo mostra a utilização de EXCEPT e UNION para descobrir as linhas diferentes de duas tabelas semelhantes.
CREATE TEMPORARY TABLE a (c1 text, c2 text, c3 text); INSERT INTO a VALUES ('x', 'x', 'x'); INSERT INTO a VALUES ('x', 'x', 'y'); -- nas duas tabelas INSERT INTO a VALUES ('x', 'y', 'x'); CREATE TEMPORARY TABLE b (c1 text, c2 text, c3 text); INSERT INTO b VALUES ('x', 'x', 'y'); -- nas duas tabelas INSERT INTO b VALUES ('x', 'x', 'y'); -- nas duas tabelas INSERT INTO b VALUES ('x', 'y', 'y'); INSERT INTO b VALUES ('y', 'y', 'y'); INSERT INTO b VALUES ('y', 'y', 'y'); -- No comando abaixo só um par ('x', 'x', 'y') é removido do resultado -- Este comando executa no DB2 8.1 sem alterações. (SELECT 'a-b' AS dif, a.* FROM a EXCEPT ALL SELECT 'a-b', b.* FROM b) UNION ALL (SELECT 'b-a', b.* FROM b EXCEPT ALL SELECT 'b-a', a.* FROM a); dif | c1 | c2 | c3 -----+----+----+---- a-b | x | x | x a-b | x | y | x b-a | x | x | y b-a | x | y | y b-a | y | y | y b-a | y | y | y (6 linhas) -- No comando abaixo são removidas todas as linhas ('x', 'x', 'y'), -- e só é mostrada uma linha ('y', 'y', 'y') no resultado -- Este comando executa no DB2 8.1 sem alterações. -- Este comando executa no Oracle 10g trocando EXCEPT por MINUS. (SELECT 'a-b' AS dif, a.* FROM a EXCEPT SELECT 'a-b', b.* FROM b) UNION (SELECT 'b-a', b.* FROM b EXCEPT SELECT 'b-a', a.* FROM a); dif | c1 | c2 | c3 -----+----+----+---- a-b | x | x | x a-b | x | y | x b-a | x | y | y b-a | y | y | y (4 linhas)
[1] |
Dados dois conjuntos A e B: chama-se diferença entre A e B o conjunto formado pelos elementos de A que não pertencem a B; chama-se interseção de A com B o conjunto formado pelos elementos comuns ao conjunto A e ao conjunto B; chama-se união de A com B o conjunto formado pelos elementos que pertencem a A ou B. Edwaldo Bianchini e Herval Paccola - Matemática - Operações com conjuntos. (N. do T.) |
[2] |
SQL Server — UNION combina os resultados de duas ou mais consultas em um único conjunto de resultados que inclui todas as linhas que pertencem à união das consultas. A operação UNION é diferente de utilizar junções que combinam colunas de duas tabelas. As regras básicas para combinar conjuntos de resultados de duas consultas utilizando UNION são as seguintes: a) O número e a ordem das colunas devem ser os mesmos em todas as consultas; b) Os tipos de dado devem ser compatíveis. UNION ALL inclui as linhas duplicadas. SQL Server 2005 Books Online — UNION (Transact-SQL) (N. do T.) |
[3] |
SQL Server — EXCEPT e INTERSECT retornam valores distintos comparando os resultados de duas consultas. EXCEPT retorna todos os valores distintos da consulta à esquerda que não se encontram na consulta à direita. INTERSECT retorna todos os valores distintos retornados pelas consultas à esquerda e a direita do operando INTERSECT. SQL Server 2005 Books Online — EXCEPT and INTERSECT (Transact-SQL) (N. do T.) |
[4] |
Oracle — Os operadores de conjunto combinam os resultados de duas consultas componentes em um único resultado. As consultas que contém operadores de conjunto são chamadas de consultas compostas. Os operadores de conjunto disponíveis são: UNION, UNION ALL, INTERSECT e MINUS (equivalente ao EXCEPT). Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01. (N. do T.) |
[5] |
DB2 — Os operadores de conjunto UNION, EXCEPT e INTERSECT correspondem aos operadores relacionais união, diferença e interseção. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |