|
Tutoriais » SQL » Intersecção » Definindo: Este comando gera uma tabela com as tuplas que estão na primeira tabela e que também estão na segunda tabela (que devem ser União Compatíveis). Este seria o comando padrao ANSI/92
SELECT * FROM depto01 INTERSECT (SELECT * FROM depto02);
No postegresql implementamos conforme o padrão, por exemplo, acessando a base adm_exerc_sqlPodemos criar uma tabela:
CREATE TABLE acoes_110120_pro AS (SELECT * FROM acoes_projetos WHERE id_acao IN ('110','120'));
SELECT * FROM acoes_110120_pro INTERSECT (SELECT * FROM acoes_projetos)
Mas o MySQL (até a 5.0) não implementa o operador INTERSECT.Podemos usar o operador IN, escrevendo assim:
SELECT * FROM depto01 WHERE CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro)
IN
(SELECT CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro) FROM depto02);
A função CONCAT coloca lado-a-lado todos os valores dos campos indicados dentro dos ().Neste exemplo colocamos todos os campos das tabelas para ter certeza que a linha inteira é igual e que está na intersecção. Ainda usando o operador IN, se as duas tabelas tiverem a mesma chave primary podemos comparar somente o valor das CPs. Devemos ter cuidado ao usar o CONCAT, pois NENHUM valor de campo pode ser NULO para o resultado ser o esperado. Podemos criar uma tabela no banco de dados com o comando create table, copiando a estrutura de uma tabela e as tuplas que são resultado de um comando SQL Por exemplo, fazemos uma intersecção e depois criamos a tabela com o resultado, desta forma
CREATE TABLE dep_inter AS (
SELECT * FROM depto01 WHERE CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro)
IN
(SELECT CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro) FROM depto02)
);
Estas tabelas ficam GRAVADAS no disco rígido e passam a constar no dicionário de dados da base.Podemos também criar uma tabela 'temporária' (fica em memória RAM somente enquanto se executa a sessão de conexão com o SGBD). Este 'tipo de tabela' é implementado em vários SGBDs. Criando uma tabela temporária e a seguir mostrando seu conteúdo:
CREATE TEMPORARY TABLE inter01 AS
SELECT * FROM depto01 WHERE CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro)
IN
(SELECT CONCAT(id_depto,
tx_nome_depto,
id_funcionario_gerente,
id_depto_superior,
tx_localizacao,
qt_area_total,
dt_criacao_depto,
dt_cadastro) FROM depto02)
);
SELECT * FROM inter01;
|