Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MilaFaba

Update apenas se todos os registros atenderem a um critério

Recommended Posts

Bom Dia Pessoal!

 

Estou quebrando a cabeça mas não consigo elaborar um determinado sql.

 

Tenho 2 tabelas.

 

Contrato e Pessoas

 

Para cada contrato eu posso ter N pessoas.Sendo assim tenho contratos com 1 ou 1000 pessoas envolvidas.Em cada contrato há pessoas ativas e inativas (com data de rescisão).

 

O que eu preciso é inativar um contrato caso 'Todas' as pessoas desse contrato estiverem inativas.

Caso o contrato tenha 1 ou várias pessoas inativas com algumas ativas ele não deve ser inativado.

 

Estou com dificuldades para elaborar essa clausula.Alguém pode me sugerir algo?

 

Já tentei com o having mas não conseguir elaborar uma solução que satisfizesse a condição.

 

Obrigada desde já!

 

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) contratos sem pessoas ativas

 

select *
from contratos
where not exists (select null
                 from pessoas
                 where pessoas.cod_contrato = contratos.cod_contrato
                 and pessoas.situacao = 'ativo')

 

2) Montar um cursor pois Oracle não faz update de tabela cruzada (até onde saiba)

 

begin
 for r in (select contratos.cod_contrato
           from contratos
           where not exists (select null
                             from pessoas
                             where pessoas.cod_contrato = contratos.cod_contrato
                             and pessoas.situacao = 'ativo'))
 loop
   update contratos set situacao = 'inativo' where cod_contrato r.cod_contrato;
 end loop;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada por sua ágil resposta Motta!

 

Bem...da forma que sugeriu ele vai exibir somente os contratos inativos E com pessoas inativas.

 

O que eu preciso seria Contratos ativos com todos os pessoas inativas.

 

:thumbsup:

 

1) contratos sem pessoas ativas

 

select *
from contratos
where not exists (select null
                 from pessoas
                 where pessoas.cod_contrato = contratos.cod_contrato
                 and pessoas.situacao = 'ativo')

 

2) Montar um cursor pois Oracle não faz update de tabela cruzada (até onde saiba)

 

begin
 for r in (select contratos.cod_contrato
           from contratos
           where not exists (select null
                             from pessoas
                             where pessoas.cod_contrato = contratos.cod_contrato
                             and pessoas.situacao = 'ativo'))
 loop
   update contratos set situacao = 'inativo' where cod_contrato r.cod_contrato;
 end loop;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites
Bem...da forma que sugeriu ele vai exibir somente os contratos inativos E com pessoas inativas.

 

O que eu preciso seria Contratos ativos com todos os pessoas inativas.

 

Exibir ou alterar ?

De qualquer forma basta uma pequena correção.

 

 

begin
 for r in (select contratos.cod_contrato
           from contratos
           where not exists (select null
                             from pessoas
                             where pessoas.cod_contrato = contratos.cod_contrato
                             and pessoas.situacao = 'ativo')
           and contratos.situacao = 'ativo')
 loop
   update contratos set situacao = 'inativo' where cod_contrato r.cod_contrato;
 end loop;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.