Ir ao conteúdo
  • Cadastre-se
marquest

Juntar duas view no postgres

Recommended Posts

Bom dia, estou fazendo uma aplicação em Java onde eu tenho que pegar informações do banco que estão em duas View. Eu não tenho muito conhecimento com banco de dados, muito menos de como juntas duas tabelas, no Java eu consegui fazer o que eu queria, mas acho que é melhor se as informações estivessem no mesmo lugar, gostaria da ajuda de alguém para criar uma nova view com estas informações. Eu tenho a view_usuarios e a view_monitor_atendente, eu quero todas as informações que estão na view_usuarios, mais as seguintes informações que estão na view_monitor_atendente: num_guiche, num senha, atividade, servicos e tempo_atividade Segue as definições das duas views.

VIEW_USUARIO

SELECT DISTINCT usuarios.id_usu,    (usuarios.nm_usu::text || ' '::text) || usuarios.ult_nm_usu::text AS nome_usu,    usuarios.login_usu,    unidades.id_uni,    unidades.cod_uni,    unidades.nm_uni,    gr.id_grupo,    gr.nm_grupo,    cargos_aninhados.id_cargo,    cargos_aninhados.nm_cargo,    usuarios.ult_acesso,    (( SELECT count(*) AS count           FROM cargos_mod_perm          WHERE cargos_mod_perm.id_cargo = cargos_aninhados.id_cargo AND cargos_mod_perm.id_mod = 2)) > 0 AS pode_atender,    usu_session.stat_session IS NOT NULL AND usu_session.stat_session > 0 AS logado,    usuarios.stat_usu = 1 AS ativo   FROM usuarios     JOIN usu_grup_cargo ON usu_grup_cargo.id_usu = usuarios.id_usu     JOIN cargos_aninhados ON cargos_aninhados.id_cargo = usu_grup_cargo.id_cargo     JOIN grupos_aninhados gr ON gr.id_grupo = usu_grup_cargo.id_grupo     JOIN unidades ON (unidades.id_grupo IN ( SELECT grupos_aninhados.id_grupo           FROM grupos_aninhados          WHERE grupos_aninhados.esquerda > (( SELECT grupos_aninhados_1.esquerda                   FROM grupos_aninhados grupos_aninhados_1                  WHERE grupos_aninhados_1.id_grupo = gr.id_grupo)) AND grupos_aninhados.direita < (( SELECT grupos_aninhados_1.direita                   FROM grupos_aninhados grupos_aninhados_1                  WHERE grupos_aninhados_1.id_grupo = gr.id_grupo)))) OR unidades.id_grupo = gr.id_grupo     LEFT JOIN usu_session ON usu_session.id_usu = usuarios.id_usu;

VIEW_MONITOR_ATENDENTE

SELECT registros.id_usu,    registros.nome_usu,    registros.login_usu,    registros.id_uni,    registros.cod_uni,    registros.nm_uni,    registros.num_guiche,    registros.num_senha,    registros.id_grupo,    registros.nm_grupo,    registros.id_cargo,    registros.nm_cargo,    registros.atividade,    registros.ult_acesso,    registros.servicos,    registros.tempo_atividade   FROM ( SELECT usu.id_usu,            usu.nome_usu,            usu.login_usu,            usu.id_uni,            usu.cod_uni,            usu.nm_uni,            atendimentos.num_guiche,            atendimentos.num_senha,            usu.id_grupo,            usu.nm_grupo,            usu.id_cargo,            usu.nm_cargo,            sp_status_atividade(usu.id_usu, usu.id_uni) AS atividade,            usu.ult_acesso,            ( SELECT array_aggr(view_servicos.sigla_serv) AS array_aggr                   FROM view_servicos                     JOIN usu_serv ON usu_serv.id_usu = usu.id_usu AND usu_serv.id_serv = view_servicos.id_serv AND usu_serv.id_uni = view_servicos.id_uni                  WHERE view_servicos.ativo AND view_servicos.id_uni = usu.id_uni) AS servicos,            now() - sp_ultima_atividade(usu.id_usu, usu.id_uni) AS tempo_atividade           FROM view_usuarios usu             LEFT JOIN atendimentos ON atendimentos.id_atend = (( SELECT atendimentos_1.id_atend                   FROM atendimentos atendimentos_1                  WHERE atendimentos_1.num_guiche IS NOT NULL AND atendimentos_1.id_usu = usu.id_usu AND atendimentos_1.id_uni = usu.id_uni                  ORDER BY atendimentos_1.dt_cha DESC                 LIMIT 1))          WHERE usu.logado AND usu.pode_atender AND usu.ativo) registros  WHERE registros.num_guiche IS NOT NULL;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,

 

Você precisa apenas fazer um join nas duas views, porém, é preciso saber quais os campos que se relacionam para não gerar plano cartesiano.

 

Vamos imaginar que o id do usuário seja suficiente para o relacionamento, então você apenas faz o join com as duas views:

select vw_usuario.*     , vw_monitor.num_guiche     , vw_monitor.num_senha     , vw_monitor.atividade     , vw_monitor.servicos     , vw_monitor.tempo_atividadefrom view_usuario as vw_usuarioleft join view_monitor_atendente as vw_monitor       on vw_monitor.id_usu = vw_usuario.id_usu

Aqui vai uma observação. Eu usei left join no lugar do inner join, pois, caso não exista monitor atendente para o usuário ele irá trazer os usuário mesmo assim. Se você quer trazer apenas os usuários que são monitor atendente, então você deve usar inner join.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×