Dificuldade em filtrar registros de uma consulta

4 respostas
M

Pessoal,

Boa tarde.
Tenho, em uma aplicação de controle acadêmico de pós-graduação de uma instituição de ensino superior, duas tabelas relacionadas : PROGRAMAS e NIVEIS.
A primeira contém informações sobre os cursos de pós-graduação da insituição, enquanto que a segunda contém as informações dos níveis(Mestrado, Mestrado Profissionalizante,Doutorado).
A primeira tabela contém um total de 46 registros(que é o total de cursos de pós-graduação).
A segunda tabela contém, para cada curso, as informações dos seus repectivos níveis, num total de 63 registros( 1 programa possui um ou mais níveis).
Estou construindo o mapeamento destas tabelas que estão em uma base Oracle para uma base PostgreSQL.
Para tal mapeamento, necessito fazer uso da query abaixo:

select
  to_char(p.prg_cod_programa) as codigo,  
  nvl(sca.f_migracao_retorna_unidade(s.set_cod_setor, 'D'),sca.f_migracao_retorna_unidade(s.set_cod_setor, 'C')) as id_unidade,
  p.prg_descricao nome,
  'true' as ativo,
  to_number(null) as id_endereco,
  CASE
    when n.niv_tipo = 1 then 'E'
    when n.niv_tipo = 2 then 'E'
    when n.niv_tipo = 3 then 'D'
  END as nivel,         
  to_char(p.prg_cod_programa) as codmerg,
  to_char(null) as codmergpa,
  61 as id_ies,
  to_number(null) as id_natureza_curso,
  1 as id_modalidade_educacao,
  to_number(null) as id_municipio,
  to_number(null) as id_convenio,
  to_char(null) as codmergpapos,
  to_char(null) codmergpos,
  CASE
    when n.niv_tipo_periodo = 1 then 1
    when n.niv_tipo_periodo = 2 then 5
    when n.niv_tipo_periodo = 3 then 4
    when n.niv_tipo_periodo = 4 then 3
  END as id_tipo_oferta_curso,  
  to_number(ac.acn_cod_area) as id_area_curso,
  to_number(s.set_campus) as id_campus,
  to_number(null) as id_arquivo,  
  nvl(sca.f_migracao_retorna_unidade(s.set_cod_setor, 'D'),sca.f_migracao_retorna_unidade(s.set_cod_setor, 'C')) as id_unidade_coordenacao, 
  to_char(p.prg_cod_programa_capes) as cod_programa_capes,
  CASE
    when n.niv_tipo = 1 then 2
    when n.niv_tipo = 2 then 1
    when n.niv_tipo = 3 then 3
  END as id_tipo_curso_stricto,        
  to_date(p.prg_data_resolucao_criacao) as dt_inicio_funcionamento,
  to_char(null) as codinepcapes,
  'false' as pode_matricular,
  CASE
    when n.niv_turno = 1 then 9
    when n.niv_turno = 2 then 2
  END as id_turno,
  to_number(null) id_grau_academico,
  CASE
    when n.niv_tipo_periodo = 1 then 3 
    when n.niv_tipo_periodo = 2 then 3
    when n.niv_tipo_periodo = 3 then 2
    when n.niv_tipo_periodo = 4 then 1
  END as id_tipo_oferta_disciplina,
  case 
      when to_number(p.prg_caracteristica) = 4 then 3
      else to_number(p.prg_caracteristica)
  end as id_organizacao_administrativa,
  to_char(null) as codigo_inep,
  to_number(null) as id_area_conhecimento_vest,
  p.prg_descricao as nome_ascii,
  to_number(null) as id_registro_cadastro,
  current_date as data_cadastro,
  to_number(null) as id_registro_atualizacao,
  to_date(null) as data_atualizacao,
  to_char(null) as campo_atuacao,
  to_char(null) as perfil_profissional,
  to_char(null) as website,
  to_number(null) as id_detalhes_site,
  to_number(null) as id_area_sesu,  
  CASE
    when n.niv_tipo = 1 then 'Mestre'
    when n.niv_tipo = 2 then 'Mestre'
    when n.niv_tipo = 3 then 'Doutor'
  END as titulacao,
  to_number(null) as id_tipo_ciclo_formacao,
  to_number(null) as id_unidade2,
  to_char(null) as competencias_habilidades,
  to_char(null) as metodologia,
  to_char(null) as gestao_curso,
  to_char(null) as avaliacao_curso,
  'False' as rede,
  to_char(null) as reconhecimentoportaria,
  to_date(p.prg_data_publicacao_dou) as dou,
  to_date(p.prg_data_resolucao_criacao) as datadecreto  
from prpg.programas p
inner join prpg.niveis n on n.niv_prg_cod_programa = p.prg_cod_programa
left join prpg.areas_conhecimento ac on p.prg_cod_area_conhecimento_cnpq = substr(ac.acn_cod_area,1,7)
left join (select pst_prg_cod_programa , max(pst_set_cod_setor) as set1 from prpg.programas_setores group by pst_prg_cod_programa) ps on 
p.prg_cod_programa = ps.pst_prg_cod_programa 
left join setores s on s.set_cod_setor = ps.set1
order by 1, nivel

Acontece, porém, que a query está me retornando um total de 63 registros.
Em outras palavras, ela está retornando as informações de cada curso(programa de pós-graduação), mas considerando cada um dos seus níveis, e não é isto o que quero.
A tabela de destino(curso, em uma base PostgreSQL), possui algums campos que necessitam de informações dos níveis, mas ela só deve contar os 46 cursos de pós-graduação, ou seja, um total de 46 registros.

Como faço para que a query acima me retorne as informações dos 46 cursos, e alguns dados dos níveis, mas não considere os níveis de cada curso no resultado final ?
Pensei em usar um GROUP BY na query acima para agrupar as informações por curso(programa), mas ainda acho que não é este o caminho.
Alguém poderia me dar alguma idéia ?

Agradece,

Max Carvalho

4 Respostas

v1c70r_f

Você pode utilizar o select distinct, aí os registros repetidos seriam ignorados.

Agora, se tem alguma informação referente ao “nível” que você comentou que não se repete, aí só tirando a informação da projeção mesmo.

M

v1c70r_f,

Tentei utilizar o distinct, mas não funciona pois cada PROGRAMA, possui “um ou mais” NÍVEIS e, em virtude do

inner join prpg.niveis n on n.niv_prg_cod_programa = p.prg_cod_programa

estão sendo trazidos também os dados dos NÍVEIS.
Alguns campos da tabela de destino(CURSOS, em uma base PostgreSQL) são populados a partir de informações dos NÍVEIS, são eles :

– popula o campo curso.nivel(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE 
     when n.niv_tipo = 1 then 'E'  
     when n.niv_tipo = 2 then 'E'  
     when n.niv_tipo = 3 then 'D'  
END as nivel

– popula o campo curso.id_tipo_oferta_cursol(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE  
    when n.niv_tipo_periodo = 1 then 1  
    when n.niv_tipo_periodo = 2 then 5  
    when n.niv_tipo_periodo = 3 then 4  
    when n.niv_tipo_periodo = 4 then 3  
END as id_tipo_oferta_curso

– popula o campo curso.id_tipo_curso_strictul(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE  
     when n.niv_tipo = 1 then 2  
     when n.niv_tipo = 2 then 1  
     when n.niv_tipo = 3 then 3  
END as id_tipo_curso_stricto

– popula o campo curso.id_turno(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE  
     when n.niv_turno = 1 then 9  
     when n.niv_turno = 2 then 2  
END as id_turno,

– popula o campo curso.id_oferta_disciplina(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE  
     when n.niv_tipo_periodo = 1 then 3   
     when n.niv_tipo_periodo = 2 then 3  
     when n.niv_tipo_periodo = 3 then 2  
     when n.niv_tipo_periodo = 4 then 1  
END as id_tipo_oferta_disciplina

– popula o campo curso.titulacao(PostgreSQL) a partir da tabela prpg.niveis(Oracle)

CASE  
     when n.niv_tipo = 1 then 'Mestre'  
     when n.niv_tipo = 2 then 'Mestre'  
     when n.niv_tipo = 3 then 'Doutor'  
END as titulacao

Alguém teria alguma outra idéia ?
Agradece,

Max Carvalho

pmlm

maxcarvalho:
v1c70r_f,

Tentei utilizar o distinct, mas não funciona pois cada PROGRAMA, possui “um ou mais” NÍVEIS e, em virtude do

inner join prpg.niveis n on n.niv_prg_cod_programa = p.prg_cod_programa

estão sendo trazidos também os dados dos NÍVEIS.

Então, se tens 46 cursos e 63 niveis e estás a obter informação dos níveis, qual deve ser o critério para escolher de entre os vários níveis possíveis para um curso?

v1c70r_f

Então carinha, acho que se quer filtrar mais, ou seja, trazer menos registros, deveria alterar a projeção (o que está na seleção).

Pois, se com o distinct ainda trás dados que não precisa, precisa eliminar da projeção os dados que fazem com que o registro não seja repetido, separando a busca desses dados em outra query.

Mas caso precise imediatamente de todas as informações, aí acho que não tem jeito, é colocar um order by e ao iterar no resultado, para os programas repetidos, ir incrementando coleções com os outros dados.

Criado 15 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 4
Participantes 3