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). Simbologia AR: A ∩ B Sintaxe: SELECT * FROM <Tabela1> INTERSECT (SELECT * FROM <Tabela2>); Exemplo: select * from depto01 INTERSECT (select * from depto02); Notas:
Na AR apresentada em 1970 não existia a operação de INTERSECÇÃO.
Dados dois conjuntos A e B para determinar a intersecção pode-se escrever: A - (A - B) ou B - (B - A).
Porém, no desenvolvimento da SQL os usuários da linguagem solicitaram que o operador INTERSECT fosse implementado.
Depois que o operador INTERSECT foi implementado, a AR teria que ser revisada. Entratanto, não existe registro de uma 'formalização' desta revisão.
Alguns autores indicaram uma notação para a intersecção seguindo a proposta da teoria dos conjuntos onde se indica o 'U' invertido como símbolo da operação.
Considere as mesmas tabelas que foram apresentadas nas operações de UNIÃO e SUBTRAÇÃO: CREATE temporary TABLE depto01 AS (SELECT * FROM departamentos WHERE deptosuperiorid IN ('A01','B01')); CREATE temporary TABLE depto02 AS (SELECT * FROM departamentos WHERE deptosuperiorid IN ('D01','B01'));
Para estas tabelas, a intersecção (linhas em comum) pode ser feita com o comando (padrao ANSI/92) SELECT * FROM depto01 INTERSECT (SELECT * FROM depto02);
O postegresql implementa os comandos do grupo DQL seguindo o padrão SQL ANSI:92. Entretanto, as sintaxes de outros grupos de comandos (DDL, DCL e DTL) NÃO SÃO seguidos completamente.
Alguns SGBDs seguem mais ou menos a padronização ANSI:92, mas no operador INTERSECT implementam o operador IN ou WHERE EXISTS que podem substrituir o INTERSECT.
No SGBD MySQL (até a 5.0), é possível 'fazer' uma Intersecção assim: SELECT * FROM depto01 WHERE CONCAT(deptoid,txnomedepto,funcionariogerenteid,deptosuperiorid,txlocalizacao,qtareatotal,dtcriacaodepto,dtcadastro)
IN (SELECT CONCAT(deptoid,txnomedepto,funcionariogerenteid,deptosuperiorid,txlocalizacao,qtareatotal,dtcriacaodepto,dtcadastro)
FROM depto02);
A função CONCAT() coloca os valores dos campos indicados formando uma única STRING.
Deve-se ter cuidado ao usar o CONCAT, o resultado nem sempre é o mesmo em todos os SGBDs, às vezes um único valor NULO na lista de valores concatenados anula todo o resultado.
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.
Então isso equivale (no comando) a comparar toda uma linha de depto01 com toda uma linha de depto02.
A comparação dos valores linhas a linha de duas tabelas ainda pode ser escrita assim: SELECT * FROM depto01 WHERE EXISTS
(SELECT * FROM depto02
WHERE
depto01.deptoid=depto02.deptoid and
depto01.tx_nome_depto=depto02.tx_nome_depto and
depto01.id_funcionario_gerente=depto02.id_funcionario_gerente and
depto01.deptoid_superior=depto02.deptoid_superior and
depto01.tx_localizacao=depto02.tx_localizacao and
depto01.qt_area_total=depto02.qt_area_total and
depto01.dt_criacao_depto=depto02.dt_criacao_depto and
depto01.dt_cadastro=depto02.dt_cadastro)