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