Help with join in two different selects

2

I have two select (somewhat complex) commands.

First code:

select 
A.no_cidadao NOME,
F.no_equipe UNIDADE
from 
tb_cds_cidadao_resposta E,
tb_cds_cad_individual A,
tb_cds_prof as G,
tb_pessoa_fisica as H,
tb_equipe as F
where
A.co_seq_cds_cad_individual = E.co_cds_cad_individual
and G.nu_cns = H.nu_cns
and G.co_seq_cds_prof = A.co_cds_prof_cadastrante
and E.co_pergunta = 19
and E.st_resposta = 1
and G.nu_ine = F.nu_ine
group by 
A.no_cidadao, F.no_equipe
order by 
F.no_equipe, A.no_cidadao

returns me:

unidade - nome
unit 1  - maria
unit 1  - severina
unit 2   - renata

Second code:

SELECT f.no_equipe UNIDADE,
   h.no_pessoa_fisica PROFISSIONAL,
   CASE
     WHEN a.no_cidadao IS NULL THEN 'GESTANTE NAO CADASTRADA'
     ELSE a.no_cidadao
   END AS NOME,
   d.dt_ficha as DATA
  FROM 
   tb_cds_atend_individual b 
   LEFT JOIN tb_cds_cad_individual a ON a.nu_cns_cidadao = b.nu_cartao_sus
   LEFT JOIN rl_cds_atend_individual_ciap c ON b.co_seq_cds_atend_individual = c.co_cds_atend_individual
   LEFT JOIN tb_cds_ficha_atend_individual d ON b.co_cds_ficha_atend_individual = d.co_seq_cds_ficha_atend_indivdl
   LEFT JOIN tb_cds_prof g ON d.co_cds_prof = g.co_seq_cds_prof
   LEFT JOIN tb_equipe f ON f.nu_ine = g.nu_ine
   LEFT JOIN tb_pessoa_fisica h ON g.nu_cns = h.nu_cns
   WHERE c.co_ciap = 727
   AND d.dt_ficha >= '2017-10-01'
   AND d.dt_ficha <= '2017-10-31'
   order by no_equipe

This returns me the fields unidade - profissional - nome - data

There is data in code 1 that does not have code 2 and vice versa. what I need to do is merge the two tables into one:

unidade - nome            - profissional - data
unit 1  - maria           - dr xico      - 31/10/2017
unit 1  - NAO CADASTRADA  - dr xico      - 25/10/2017 //não achou o nome no codigo 1
unit 1  - severina        - dr xico      - 28/10/2017
unit 2  - renata          - SEM CONSULTA -     X      //não achou o nome no codigo 2
    
asked by anonymous 31.10.2017 / 15:44

2 answers

1

See if the format below helps you. I did not do much modification in your query, I just used the two querys reported as a subselect, using a " union all " in them.

SELECT X.UNIDADE,
       X.PROFISSIONAL,
       X.NOME,
       X.DATA

FROM (
SELECT f.no_equipe as UNIDADE,
       h.no_pessoa_fisica  as PROFISSIONAL,
   CASE
     WHEN a.no_cidadao IS NULL THEN 'GESTANTE NAO CADASTRADA'
     ELSE a.no_cidadao
   END AS NOME,
   d.dt_ficha as DATA
  FROM 
   tb_cds_atend_individual b 
   LEFT JOIN tb_cds_cad_individual a ON a.nu_cns_cidadao = b.nu_cartao_sus
   LEFT JOIN rl_cds_atend_individual_ciap c ON b.co_seq_cds_atend_individual = c.co_cds_atend_individual
   LEFT JOIN tb_cds_ficha_atend_individual d ON b.co_cds_ficha_atend_individual = d.co_seq_cds_ficha_atend_indivdl
   LEFT JOIN tb_cds_prof g ON d.co_cds_prof = g.co_seq_cds_prof
   LEFT JOIN tb_equipe f ON f.nu_ine = g.nu_ine
   LEFT JOIN tb_pessoa_fisica h ON g.nu_cns = h.nu_cns
   WHERE c.co_ciap = 727
   AND d.dt_ficha >= '2017-10-01'
   AND d.dt_ficha <= '2017-10-31'
   -- order by no_equipe

   UNION ALL

select 
F.no_equipe as UNIDADE,
null as PROFISSIONAL,
A.no_cidadao as NOME,
null as DATA

from 
tb_cds_cidadao_resposta E,
tb_cds_cad_individual A,
tb_cds_prof as G,
tb_pessoa_fisica as H,
tb_equipe as F
where
A.co_seq_cds_cad_individual = E.co_cds_cad_individual
and G.nu_cns = H.nu_cns
and G.co_seq_cds_prof = A.co_cds_prof_cadastrante
and E.co_pergunta = 19
and E.st_resposta = 1
and G.nu_ine = F.nu_ine
group by 
A.no_cidadao, F.no_equipe
--order by 
--F.no_equipe, A.no_cidadao 
 ) X

ORDER BY X.UNIDADE, x.NOME
    
31.10.2017 / 16:15
0

I did not dig deeper into your model, to better understand what you need, focusing only on the need to match two different selects.

One of the options is to use temporary tables:

with tabelaX as (
select 
A.no_cidadao NOME,
F.no_equipe UNIDADE
from 
tb_cds_cidadao_resposta E,
tb_cds_cad_individual A,
tb_cds_prof as G,
tb_pessoa_fisica as H,
tb_equipe as F
where
A.co_seq_cds_cad_individual = E.co_cds_cad_individual
and G.nu_cns = H.nu_cns
and G.co_seq_cds_prof = A.co_cds_prof_cadastrante
and E.co_pergunta = 19
and E.st_resposta = 1
and G.nu_ine = F.nu_ine
group by 
A.no_cidadao, F.no_equipe
order by 
F.no_equipe, A.no_cidadao), 

tabelaY as (

SELECT f.no_equipe UNIDADE,
   h.no_pessoa_fisica PROFISSIONAL,
   COALESCE(a.no_cidadao,'Gestante não cadastrada') as nome, --não precisa do case para colunas nulas, utilize o coalesce
   d.dt_ficha as DATA
  FROM 
   tb_cds_atend_individual b 
   LEFT JOIN tb_cds_cad_individual a ON a.nu_cns_cidadao = b.nu_cartao_sus
   LEFT JOIN rl_cds_atend_individual_ciap c ON b.co_seq_cds_atend_individual = c.co_cds_atend_individual
   LEFT JOIN tb_cds_ficha_atend_individual d ON b.co_cds_ficha_atend_individual = d.co_seq_cds_ficha_atend_indivdl
   LEFT JOIN tb_cds_prof g ON d.co_cds_prof = g.co_seq_cds_prof
   LEFT JOIN tb_equipe f ON f.nu_ine = g.nu_ine
   LEFT JOIN tb_pessoa_fisica h ON g.nu_cns = h.nu_cns
   WHERE c.co_ciap = 727
   AND d.dt_ficha >= '2017-10-01'
   AND d.dt_ficha <= '2017-10-31'
   order by no_equipe)

Select
* 
from TabelaX x 
left outer join TabelaY Y on Y.nome = x.nome or (y.nome is null and x.unidade = y.unidade)
  

Notice the Coalesce issue for column name.

     

Maybe if you put the base model, you can better understand and even suggest another (better) solution to the problem.

    
31.10.2017 / 16:14