Cadastre-se Revistas DevMedia Cursos
 

Space de Guilherme Pendezza de Sousa
Busca Autor


Últimas 20 atualizações de Guilherme Pendezza de Sousa

Artigo - Produto cartesiano e UNION no Oracle

No post de hoje vou explicar o conceito de produto cartesiano, o operador union e, no final do post, vamos fazer uma brincadeirinha para exemplificar os conceitos.

Vamos ao produto cartesiano. Quando precisamos selecionar dados de mais de uma tabela, temos que informar os campos (chaves) pelos quais as tabelas são ligadas, é a tal da "join condition". Ela pode ser escrita de duas formas: na clausula where, ou na clausula from. Vejamos os exemplos a seguir:

Listagem 1:Exemplo Join com condição na cláusula FROM

SELECT tabela1.campo1, tabela1.campo2, tabela2.campo1
FROM tabela1 INNER JOIN tabela2 ON tabela1.campoPK = tabela2.campoFK;

Listagem 2: Exemplo de join com a condição na clausula WHERE:

SELECT tabela1.campo1, tabela1.campo2, tabela2.campo1
FROM tabela1, tabela2
WHERE tabela1.campoPK = tabela2.campoFK;

Quando, por algum motivo(geralmente esquecimento...), omitimos a join condition o resultado da nossa consulta é um produto cartesiano que é o relacionamento de cada linha da primeira tabela com cada linha da segunda tabela(no caso de haver somente duas tabelas). O numero de registros retornados é a multiplicação dos numeros de registros de cada tabela. Exemplo:

  • Tabela1, 1000 registros;
  • Tabela2, 2000 registros;
  • Numero de registros retornados no produto cartesiano entra a tabela1 e a tabela2: 1000 x 2000 = 2.000.000 de registros!!!

Regra: Numero de registros no produto cartesiano = count(tabela1) x count(tabela2) x ... x count(tabelaN).

NÃO TESTE UM PRODUTO CARTESIANO EM UM AMBIENTE DE PRODUÇÃO!!! INSTALE O ORACLE NA SUA MAQUINA PARA FAZER O TESTE.

Apesar de o produto cartesiano, na maioria das vezes, não retornar alguma informação útil, vou usá-lo aqui na nossa brincadeira.

Agora o operador UNION. Representa a união(U) da teoria dos conjuntos que aprendemos lá no colegial(colegial??? to ficando velho...). Podemos usá-lo para unir duas consultas em um só resultado. Geralmente fazemos isso quando não é possível escrever toda a condição na clausula where ou quando usando UNION nossa consulta fique mais clara. Exemplo: Preciso selecionar o nome de todos os funcionários ativos e os demitidos entre 01/03/2011 e 31/03/2011.

Listagem 3: Sem UNION

SELECT nome 
FROM funcionario
WHERE (FLG_DEMITIDO = 'N') OR (FLG_DEMITIDO = 'S' AND TRUNC(DATA_DEMISSAO) BETWEEN '01-mar-2011' and '31-mar-2011');

Listagem 4: Com UNION:

--Funcionários ativos
SELECT nome 
FROM funcionario
WHERE (FLG_DEMITIDO = 'N')
UNION
--Funcionários demitidos
SELECT nome 
FROM funcionario
WHERE FLG_DEMITIDO = 'S' 
AND TRUNC(DATA_DEMISSAO) BETWEEN '01-mar-2011' and '31-mar-2011';

No meu ponto de vista, a consulta usando UNION fica bem mais clara e f

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
25/05/2012 15:28:00





 

Desenvolvedor Web freelancer desde 2010 usando .NET Framework 3.5 com C#, AJAX e bancos de dados SQL Server e mySQL. Desenvolvedor de aplicações desktop em uma empresa do setor sucroalcooleiro desde 2011 usando Oracle Forms / Reports, PL/SQL e banco de dados Oracle 9i.
Arquivo de atualizações
 2012

Estatísticas do Autor:
Número de posts: 1
 
DevMedia Group - Tel: (21) 3382-5038 - www.devmedia.com.br
Todos os Direitos Reservados a DevMedia Group