1
resposta

MINHA SOLUÇÃO

Bom dia a todos,

Primeiramente fiz um SELECT nas três tabelas para visualizar os dados.

SELECT * FROM TABELA_FUNCIONARIO;
SELECT * FROM TAB_RH_DEMITIDOS;
SELECT * FROM TABELA_DEPENDENTES;

Depois eu fiz o Left Join para identificar quem era igual em ambas as tabelas, quem não era NULO. Poderia usar o INNER JOIN , mas quis utilizar para treinar o Left Join

SELECT 
TF.CODIGO_FUNCIONARIO, TRD.COD_FUNCIONARIO FROM TABELA_FUNCIONARIO TF
LEFT JOIN TAB_RH_DEMITIDOS TRD
ON TF.CODIGO_FUNCIONARIO = TRD.COD_FUNCIONARIO;

Identifiquei quem estava igual e fiz um NOT NULL para me mostrar apenas os pares.

SELECT 
TF.CODIGO_FUNCIONARIO FROM TABELA_FUNCIONARIO TF
LEFT JOIN TAB_RH_DEMITIDOS TRD
ON TF.CODIGO_FUNCIONARIO = TRD.COD_FUNCIONARIO
WHERE TRD.COD_FUNCIONARIO IS NOT NULL;

Encontrei a fórmula para fazer o DELETE, porém ao tentar excluir deu erro de violação de chave estrangeira, pois havia conexão desse campo com a TABELA_DEPENDENTES.
Então eu utilizei essa fórmula acima num DELETE na TABELA_DEPENDENTES primeiro, assim consegui excluir todos os dependentes de quem foi demitido.

DELETE FROM TABELA_DEPENDENTES TD
WHERE TD.CODIGO_FUNCIONARIO IN (SELECT 
TF.CODIGO_FUNCIONARIO FROM TABELA_FUNCIONARIO TF
LEFT JOIN TAB_RH_DEMITIDOS TRD
ON TF.CODIGO_FUNCIONARIO = TRD.COD_FUNCIONARIO
WHERE TRD.COD_FUNCIONARIO IS NOT NULL);

Por fim utilizei a mesma lógica para tentar novamente os funcionários , e dessa vez, como não havia nenhum vínculo em outra tabela foi possível a exclusão, e assim completando o exercício.

DELETE FROM TABELA_FUNCIONARIO TF
WHERE TF.CODIGO_FUNCIONARIO IN (SELECT 
TF.CODIGO_FUNCIONARIO FROM TABELA_FUNCIONARIO TF
LEFT JOIN TAB_RH_DEMITIDOS TRD
ON TF.CODIGO_FUNCIONARIO = TRD.COD_FUNCIONARIO
WHERE TRD.COD_FUNCIONARIO IS NOT NULL);
1 resposta

Oii Adriano, tudo bem?

Obrigada por compartilhar sua solução no fórum, com certeza vai ajudar outros alunos que passarem pelo mesmo exercício!

Você resolveu muito bem o problema da violação de chave estrangeira: percebeu sozinho que precisava deletar os dependentes antes dos funcionários, o que demonstra boa compreensão de integridade referencial. Além disso, a escolha de usar o LEFT JOIN com filtro IS NOT NULL em vez do INNER JOIN é válida e funciona perfeitamente, treinar variações assim é uma ótima prática.

Uma observação que vale registrar: o alias TF foi reutilizado tanto na query externa quanto na subquery do último DELETE. O Oracle consegue resolver isso pelo escopo, mas para deixar o código mais legível e evitar ambiguidades em queries mais complexas, vale usar aliases diferentes entre a query principal e a subquery.

Conte com a Alura para evoluir seus estudos. Em caso de dúvidas, fico à disposição.

Bons estudos!

Sucesso

Imagem da comunidade