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).