Unir duas tabelas em SQL
outubro 24, 2007
O operador UNION permite a combinação de mais de dois resultados de uma instrução SQL em um único resultado de consulta. Os resultados combinados no operador UNION devem ter a mesma estrutura, ou seja, a mesma quantidade e tipos de campos devem coincidir em todas as consultas.
Segue abaixo a sintaxe da utilização do operador UNION:
INSTRUCAO_SELECT
UNION [ALL]
INSTRUCAO_SELECT
Para demonstrar como se utiliza o operador UNION, segue abaixo uma instrução de criação de uma tabela de clientes referente à pessoas físicas (ClienteFisico) e outra contendo as informações de clientes referente à pessoas jurídicas, com campos diferentes é claro (se não, não haveria a necessidade de criação de uma segunda tabela de diferenciação).
CREATE TABLE dbo.ClienteFisico
(
ID bigint NOT NULL,
Nome varchar(64) NOT NULL,
RG varchar(16) NOT NULL,
Nascimento datetime NOT NULL
) ON [PRIMARY]
CREATE TABLE dbo.ClienteJuridico
(
ID bigint NOT NULL,
NomeFantasia varchar(64) NOT NULL,
CNPJ bigint NOT NULL,
IE varchar(16) NOT NULL
) ON [PRIMARY]
Após a criação das tabelas acima pode-se unir ambas em um único resultado de consulta.
SELECT
ID,
Nome
FROM
ClienteFisico
UNION
SELECT
ID,
NomeFantasia
FROM
ClienteJuridico
A consulta acima irá retornar todos os clientes físicos e jurídicos existentes nas respectivas tabelas (ClienteFisico e ClienteJuridico)
SELECT
ID,
Nome,
RG
FROM
ClienteFisico
UNION
SELECT
ID,
NomeFantasia,
CNPJ
FROM
ClienteJuridico
Esta consulta não irá funcionar, ocorrerá um erro, porque os tipos não correspondem. O campo RG é do tipo VARCHAR que contém até 16 caracteres enquanto o campo CNPJ é do tipo CHAR que contém 14 caracteres. Este problema é fácil de ser resolvido, basta converter o resultado de um dos campos para que os dois tenham o mesmo tipo.
SELECT
ID,
Nome,
RG
FROM
ClienteFisico
UNION
SELECT
ID,
NomeFantasia,
CONVERT(VARCHAR(16), CNPJ) AS CNPJ
FROM
ClienteJuridico
Acima é demonstrado a conversão feita no campo CNPJ atribuindo um alias (codinome) ao campo, caso não seja feito, irá mostrar o campo sem nome no título do resultado.
Existe um operador que pode ser utilizado com o UNION, o ALL. A consulta com o operador ALL indica que NÃO será eliminado nenhuma duplicidade que ocorrer entre as tabelas, ou seja, mostrará tudo que existir nas tabelas que estão sendo unidas com resultado. Se omitir o ALL, como padrão, o SQL remove linhas dos resultados que duplicaram.
SELECT
ID,
Nome
FROM
ClienteFisico
UNION ALL
SELECT
ID,
NomeFantasia
FROM
ClienteJuridico
É claro que não irá servir para muita coisa o operador ALL na consulta acima, porque não existe nenhum cliente físico que possua o mesmo nome de um cliente jurídico (pelo menos que eu conheça).