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.
Verificação de consistência
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...
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...
- fsitja
- 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
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.
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.
[]'s
Francisco.
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>
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
Francisco.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes