Verificação de consistência

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Diego Ski
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 22 Dez 2009 10:35 am
Localização: Brasilia - DF

Olá,

Preciso gerar um comando sql para verificar a consistencia de uma tabela.

A tabela ProgramaParaFiscalizarTrabalho é composta de uma coluna fiscaliza, coluna programa e uma que determina uma check constraint, denonimada objetoespecifico(sim ou não).

A questão é que um programa não pode ser especifico(sim) em mais de uma fiscalizacao com objetos diferentes.

Como eu faço para gerar esse select?

Obrigado.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Se eu entendi bem, seria o caso de agrupar programa e o objeto específico onde objeto específico = sim e o valor de fiscaliza é diferente entre os registros agrupados?

Por exemplo, se existirem dois ou mais registros com objeto específico = sim e mesmo programa, mas com fiscaliza diferenes, quer dizer que existe inconsistencia na tabela?

Se for isto é fácil montar o select e, como sempre, existe mais de uma maneira de fazê-lo... Como eu disse, utilize funções de agrupamento...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Você pode criar um unique index na tabela, que não permitirá que sejam inseridos registros duplicados. Estou assumindo que valores NÃO para objetoespecífico podem ser duplicados, pois você mencionou apenas em caso de SIM.

Selecionar tudo

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as fsitja
 
SQL> 
SQL> create table ProgramaParaFiscalizarTrabalho
  2  (fiscaliza varchar2(20),
  3   programa varchar2(20),
  4   objetoespecifico varchar2(1) check (objetoespecifico in ('S', 'N')))
  5  /
 
Table created
 
SQL> 
SQL> create unique index i_uk_obj on ProgramaParaFiscalizarTrabalho
  2    (case when objetoespecifico = 'S' then fiscaliza else null end,
  3     case when objetoespecifico = 'S' then programa else null end,
  4     case when objetoespecifico = 'S' then 1 else null end)
  5  /
 
Index created
 
SQL> 
SQL> insert into ProgramaParaFiscalizarTrabalho (fiscaliza, programa, objetoespecifico)
  2  values ('AAA', 'PROGRAMA 1', 'S');
 
1 row inserted
 
SQL> 
SQL> insert into ProgramaParaFiscalizarTrabalho (fiscaliza, programa, objetoespecifico)
  2  values ('AAA', 'PROGRAMA 1', 'N');
 
1 row inserted
 
SQL> 
SQL> insert into ProgramaParaFiscalizarTrabalho (fiscaliza, programa, objetoespecifico)
  2  values ('AAA', 'PROGRAMA 1', 'N');
 
1 row inserted
 
SQL> 
SQL> insert into ProgramaParaFiscalizarTrabalho (fiscaliza, programa, objetoespecifico)
  2  values ('AAA', 'PROGRAMA 1', 'S');
 
insert into ProgramaParaFiscalizarTrabalho (fiscaliza, programa, objetoespecifico)
values ('AAA', 'PROGRAMA 1', 'S')
 
ORA-00001: unique constraint (FSITJA.I_UK_OBJ) violated
 
SQL> 
Porém, se já houver "sujeira", ou seja, registros duplicados, você terá que limpá-los antes de criar o unique index. Com o select abaixo você consegue buscar os registros duplicados, então é só eliminá-los para depois criar o unique index, que vai garantir que não haverá mais inconsistências na tabela. Mesmo que se tente inserir não vai deixar.

Selecionar tudo

select case when objetoespecifico = 'S' then fiscaliza else null end as fiscaliza,
       case when objetoespecifico = 'S' then programa else null end as programa,
       case when objetoespecifico = 'S' then objetoespecifico else null end as objetoespecifico,
       count(*)
  from ProgramaParaFiscalizarTrabalho
 group by 
   case when objetoespecifico = 'S' then fiscaliza else null end,
   case when objetoespecifico = 'S' then programa else null end,
   case when objetoespecifico = 'S' then objetoespecifico else null end
having count(*) > 1 
       and (case when objetoespecifico = 'S' then fiscaliza else null end) is not null
[]'s
Francisco.
Diego Ski
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 22 Dez 2009 10:35 am
Localização: Brasilia - DF

Valeu cara...ajudou legal!!
Responder
  • Informação
  • Quem está online

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