MilaFaba 0 Denunciar post Postado Outubro 10, 2012 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
Motta 645 Denunciar post Postado Outubro 10, 2012 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
MilaFaba 0 Denunciar post Postado Outubro 10, 2012 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
Motta 645 Denunciar post Postado Outubro 10, 2012 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