exclusão de dados com set oparator minus

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Galera estou resolvendo uns exercicios do livro OCA SQL Fundamentals I. Já estou no capitulo de set operators e encontrei um problema.
O exercicio pedia que fosse criado uma query que trouxesse o EMPLOYEE_ID e LAST_NAME de employees dos empregados que nunca mudaram de emprego.
Realizei a query para ver quais empregados já mudaram de emprego:

Selecionar tudo

SELECT * FROM JOB_HISTORY ORDER BY EMPLOYEE_ID
O resultado obtido não poderia existir na lista que iria construir uma vez que este employees são aqueles que já trocaram de emprego.
Então realizei a seguinte query que iria excluir estes dados.

Selecionar tudo

SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES
MINUS
SELECT EMPLOYEE_ID, TO_CHAR(NULL) FROM JOB_HISTORY JH JOIN EMPLOYEES EMP ON(JH.EMPLOYEE_ID = EMP.EMPLOYEE_ID);
O final esperado que era a exclusão dos dados do segundo select acabou trazendo alguns dados do segundo select também.
Estou utilizando Oracle 11G.

Abraços, feliz ano novo a todos.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Rafael,

Você poderia pesquisar um pouco sobre os comandos "SELECT .. FROM ..WHERE <CAMPO> NOT IN .." ou então "SELECT .. FROM ... WHERE EXISTS (SELECT 1 FROM WHERE...)".

Resumindo, pesquise um pouco sobre os comandos EXISTS e NOT IN.

Creio que eles seriam suficientes para substituir o comando MINUS.

Se pesquisar e mesmo assim tiver dúvidas, fique à vontade para continuar perguntando.

Ou .. se a resposta foi suficiente, então poste a querie final usando uma destas funções.

Abraços e excelente início de ano !

Sergio Coutinho
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Caro Coutinho,
obrigado pela ajuda, sei que tem como realizar com select simples, mas devido a procura pela certificação estou tentando realizar o exercicio com a solução proposta usando set operator.

Consegui realizar a questão omitindo o nome, mas não consigo entender o por quê.

Selecionar tudo

SELECT EMPLOYEE_ID FROM EMPLOYEES
MINUS
SELECT EMPLOYEE_ID FROM JOB_HISTORY GROUP BY EMPLOYEE_ID;
Se alguém tiver alguma referencia boa sobre SET OPERATOR, por favor poderia disponibilizar?!

Abração e novamente gostaria de agradecer o conselho do Coutinho que tem ajudado todos nós aqui do Glufke.
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Olá caros,
encontrei a solução para este problema.
Os dados para exclusão devem ser idênticos, ou seja para a utilização do MINUS, além das duas regras existe uma "terceira":
1- As colunas da 1ª query devem ser iguais da 2ª query
2- Os tipos de dados das colunas devem ser semelhantes.
*3- Para utilização do MINUS os dados devem ser idênticos.

Segue a solução do exercício.

Selecionar tudo

SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES
MINUS
SELECT EMPLOYEE_ID, LAST_NAME FROM JOB_HISTORY JOIN EMPLOYEES USING(EMPLOYEE_ID);
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 31 visitantes