Olá pessoas!
Não é de hoje que vejo o pessoal que está iniciando com SQL tendo problemas como EXCEPT, INTERSECT e UNION, ou não sabendo que eles existem. Desta forma, vamos à explicação!
A principal ideia destas cláusulas é ‘somar’ e ‘subtrair’ os registros de duas ou mais consultas.
UNION ALL e UNION
Iniciando com o UNION ALL, ele permite unir os registros de duas consultas. No exemplo abaixo, temos a tabela @A com os registros José, Maria e João, e a tabela @B com os registros Maria, Guilherme e Vitória.
Como no caso o registro Maria com ID 2 está presente nas duas tabelas, com UNION ALL, o registro irá se repetir. Caso queira que os registros iguais não se repitam, basta usar UNION, conforme o exemplo abaixo.
Internamente no SQL Server, o que o UNION faz é um UNION ALL seguindo de um DISTINCT, ou seja, as duas consultas abaixo tem o mesmo plano de execução no SQL Server e funcionam da mesma forma.
1 2 3 | SELECT ID, NOME FROM @AUNIONSELECT ID, NOME FROM @B |
1 2 3 4 5 6 | SELECT DISTINCT ID, NOMEFROM ( SELECT ID, NOME FROM @A UNION ALL SELECT ID, NOME FROM @B) AS C |
Plano de execução:
Desta forma, evite usar UNION quando UNION ALL já é o suficiente.
EXCEPT
Quando se quer que apareçam os registros da tabela A que não são iguais aos da tabela B, temos a opção de ‘subtrair’ os registros utilizando EXCEPT.
___
INTERSECT
Por fim, o uso de INTERSECT permite uma intersecção entre as consultas. Que diabos é intersecção? Então, seria como exibir somente os registros que as duas consultas têm em comum.
Considerações finais
Abaixo a consulta completa deste post:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | DECLARE @A TABLE ( ID INT NOT NULL, NOME VARCHAR(10) NOT NULL)DECLARE @B TABLE ( ID INT NOT NULL, NOME VARCHAR(10) NOT NULL)INSERT @AVALUES (1, 'José'), (2, 'Maria'), (3, 'João')INSERT @BVALUES (2, 'Maria'), (3, 'Guilherme'), (4, 'Vitória')SELECT Título = 'UNION ALL'SELECT ID, NOME FROM @AUNION ALLSELECT ID, NOME FROM @BSELECT Título = 'UNION'SELECT ID, NOME FROM @AUNIONSELECT ID, NOME FROM @BSELECT Título = 'EXCEPT'SELECT ID, NOME FROM @AEXCEPTSELECT ID, NOME FROM @BSELECT Título = 'INTERSECT'SELECT ID, NOME FROM @AINTERSECT |





Nenhum comentário:
Postar um comentário