Como usar o INTERSECT e EXCEPT operações no SQL
o UNIÃO operação produz uma tabela de resultados que contém todas as linhas que aparecem no qualquer das tabelas de fonte de SQL. Se você quiser apenas as linhas que aparecem no todos as tabelas de origem, você pode usar o INTERSECT operação, que é a implementação de operação SQL intersecção da álgebra relacional. INTERSECT pode ser ilustrado por retornar ao mundo de fantasia em que Bob Turley foi negociado para o Dodgers na midseason:
SELECT * DE NATIONAL-Nome Sobrenome CompleteGames --------- -------- ------------- Sal Maglie 11Don Newcombe9SandyKoufax 13Don Drysdale12Bob Turley 8SELECT * FROM American- FIRST_NAME LAST_NAME COMPLETE_GAMES ---------- --------- -------------- Whitey Ford 12Don Larson 10Bob Turley 8AllieReynolds14
Somente as linhas que aparecem em todas as tabelas de origem aparecem na INTERSECT tabela de resultados da operação:
SELECT * FROM NATIONALINTERSECTSELECT * FROM AMERICAN-Nome Sobrenome CompleteGames --------- -------- ------------- Bob Turley 8
A tabela de resultados diz que Bob Turley foi o único jarro para jogar o mesmo número de jogos completos em ambas as ligas (uma distinção bastante obscura para o velho Bala Bob). Nota: Como foi o caso com UNIÃO, INTERSECT DISTINCT produz o mesmo resultado que o INTERSECT operador usado sozinho. Neste exemplo, apenas uma das linhas idênticas caracteriza Bob Turley é devolvido.
o TODOS e CORRESPONDENTE expressões funcionar numa INTERSECT operação da mesma maneira que fazem em um UNIÃO operação. Se você usar TODOS, duplicados são retidos na tabela de resultados. Se você usar CORRESPONDENTE, as tabelas de interseção não precisa ser união-compatíveis, embora as colunas correspondentes devem ter tipos de correspondentes e comprimentos.
Aqui está o que você ganha com INTERSECT ALL:
SELECT * DE NATIONALINTERSECT ALLSELECT * FROM AMERICAN-Nome Sobrenome CompleteGames --------- -------- ------------- Bob Turley 8Bob Turley 8
Veja outro exemplo: Um município guarda informação sobre os telefones celulares carregados por policiais, bombeiros, varredores de rua e outros funcionários da cidade. Uma tabela de banco de dados chamado TELEFONES contém dados sobre todos os telefones em uso ativo. Outra tabela chamada OUT, com uma estrutura idêntica, contém dados sobre todos os telefones que foram tomadas fora de serviço.
Sem telefones nunca deve existir em ambas as tabelas. Com um INTERSECT operação, você pode testar para ver se uma duplicação tais indesejada ocorreu:
SELECT * DE PHONESINTERSECT correspondente (phoneid) SELECT * FROM OUT -
Se esta operação dá-lhe uma tabela de resultados que contém todas as linhas em tudo, você sabe que tem um problema. Você deve investigar qualquer phoneid entradas que aparecem na tabela de resultados. O telefone correspondente é ativo ou fora do serviço- não pode ser ambos. Depois de detectar o problema, você pode executar uma EXCLUIR operação em uma das duas tabelas de restaurar a integridade de dados.
o UNIÃO operação atua em duas tabelas de origem e retorna todas as linhas que aparecem em qualquer mesa. o INTERSECT operação retorna todas as linhas que aparecem em ambas as primeira e segunda tabelas. Em contraste, o EXCETO (ou EXCETO DISTINCT) Operação retorna todas as linhas que aparecem na primeira mesa, mas que não também aparecem na segunda tabela.
Voltando ao exemplo de banco de dados de telefone municipal, dizer que um grupo de telefones que tinham sido declarados fora de serviço e devolvidos ao fornecedor para reparos agora foram corrigidos e colocado de volta em serviço. A tabela TELEFONES foi atualizado para refletir os telefones devolvidos, mas os telefones devolvidos não foram removidos da tabela OUT como deveriam ter sido.
Você pode exibir o phoneid números dos telefones na tabela OUT, com os reativados eliminado, usando um EXCETO operação:
SELECT * DE OUTEXCEPT correspondente (phoneid) SELECT * FROM Phones
Esta consulta retorna todas as linhas na tabela OUT cujas phoneid também não é apresentada na tabela de PHONES.