Free CSS Button Css3Menu.com

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)


Tutoriais » SQL » Intersecção »