- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 5 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
24 de junho de 2018 às 9:16 pm #109298JanainaParticipante
Olá pessoal, como vai?
Tenho um script que não estou conseguindo finalizar pois preciso trazer dados de 2 tabelas, porém na segunda tabela não consta todos os registros existentes na primeira tabela. Vou exemplificar:
TABELA A
Sequencia Exame
1233 Hemograma
1234 Malaria
1235 Toxoplasmose
1236 UltrassomTABELA B
Sequencia Exame Status Exame
1233 Hemograma Realizado
1234 Malaria RealizadoRETORNO ESPERADO
Sequencia Exame Status Exame
1233 Hemograma Realizado
1234 Malaria Realizado
1235 Toxoplasmose Nulo
1236 Ultrassom Nulo —————————————————————————————————————————————————————————–
[b][u]SELECT 1 (IMAGEM 1) – Nesse select é exibido todos os exames contidos na mesma ficha/paciente (6 exames):
[/u][/b]SELECT DISTINCT
F.NR_SEQ_EXAME,
SUBSTR(OBTER_DESC_EXAME(F.NR_SEQ_EXAME), 1, 255) DS_EXAME
FROM
LOTE_ENT_SECRETARIA A,
LOTE_ENT_INSTITUICAO B,
LOTE_ENT_SEC_FICHA C,
LOTE_ENT_SEC_FICHA_EXAM D,
PRESCR_MEDICA E,
PRESCR_PROCEDIMENTO F,
EXAME_LAB_RESULTADO G,
EXAME_LAB_RESULT_ITEM H/* LOTE_ENT_RECONVOCADO I,
LOTE_ENT_RECONVOCADO_ITEM J,
LOTE_ENT_RECONVOCADO_CONT K*/WHERE A.NR_SEQ_INSTITUICAO = B.NR_SEQUENCIA
AND C.NR_SEQ_LOTE_SEC = A.NR_SEQUENCIA
AND D.NR_SEQ_FICHA = C.NR_SEQUENCIA
AND E.NR_SEQ_FICHA_LOTE = C.NR_SEQUENCIA
AND E.NR_SEQ_LOTE_ENTRADA = A.NR_SEQUENCIA
AND F.NR_PRESCRICAO = E.NR_PRESCRICAO
AND G.NR_PRESCRICAO = E.NR_PRESCRICAO
AND H.NR_SEQ_RESULTADO = G.NR_SEQ_RESULTADO/*AND I.NR_SEQ_FICHA_LOTE = C.NR_SEQUENCIA
AND I.NR_SEQ_LOTE_SEC = A.NR_SEQUENCIA
AND J.NR_PRESCRICAO = F.NR_PRESCRICAO
AND J.NR_SEQ_PRESCR = F.NR_SEQUENCIA
AND J.NR_SEQ_RECONVOCADO = I.NR_SEQUENCIA
AND K.NR_SEQ_RECONVOCADO = I.NR_SEQUENCIA */AND E.NR_PRESCRICAO = 202130
AND F.IE_STATUS_ATEND = 35
AND F.IE_SUSPENSO = ‘N’———————————–
[b][u]
SELECT 2 (IMAGEM 2) – Nesse select é exibido somente os exames que possuem o campo “J.NR_SEQ_STATUS_RECONV” preenchido, (4 exames), os outros dois exames não são mostrados:[/u][/b]SELECT DISTINCT
F.NR_SEQ_EXAME,
SUBSTR(OBTER_DESC_EXAME(F.NR_SEQ_EXAME), 1, 255) DS_EXAME,
J.NR_SEQ_STATUS_RECONVFROM
LOTE_ENT_SECRETARIA A,
LOTE_ENT_INSTITUICAO B,
LOTE_ENT_SEC_FICHA C,
LOTE_ENT_SEC_FICHA_EXAM D,
PRESCR_MEDICA E,
PRESCR_PROCEDIMENTO F,
EXAME_LAB_RESULTADO G,
EXAME_LAB_RESULT_ITEM H,LOTE_ENT_RECONVOCADO I,
LOTE_ENT_RECONVOCADO_ITEM J,
LOTE_ENT_RECONVOCADO_CONT KWHERE A.NR_SEQ_INSTITUICAO = B.NR_SEQUENCIA
AND C.NR_SEQ_LOTE_SEC = A.NR_SEQUENCIA
AND D.NR_SEQ_FICHA = C.NR_SEQUENCIA
AND E.NR_SEQ_FICHA_LOTE = C.NR_SEQUENCIA
AND E.NR_SEQ_LOTE_ENTRADA = A.NR_SEQUENCIA
AND F.NR_PRESCRICAO = E.NR_PRESCRICAO
AND G.NR_PRESCRICAO = E.NR_PRESCRICAO
AND H.NR_SEQ_RESULTADO = G.NR_SEQ_RESULTADOAND I.NR_SEQ_FICHA_LOTE = C.NR_SEQUENCIA
AND I.NR_SEQ_LOTE_SEC = A.NR_SEQUENCIA
AND J.NR_PRESCRICAO = F.NR_PRESCRICAO
AND J.NR_SEQ_PRESCR = F.NR_SEQUENCIA
AND J.NR_SEQ_RECONVOCADO = I.NR_SEQUENCIA
AND K.NR_SEQ_RECONVOCADO = I.NR_SEQUENCIAAND E.NR_PRESCRICAO = 202130
AND F.IE_STATUS_ATEND = 35
AND F.IE_SUSPENSO = ‘N’——————————————————————————
Preciso que o retorno do script traga os 6 exames, independente do campo “J.NR_SEQ_STATUS_RECONV” estar preenchido ou não.
Tentei usar (+), mas acredito que não estou utilizando nos campos / tabelas corretas.
Desde já agradeço a ajuda!
Janaina25 de junho de 2018 às 5:41 pm #109299José Laurindo ChiappaModeradorTudo joinha ? Espero que sim….
Bem, a sua necessidade de numa junção de tabelas trazer os registros duma tabela A aonde não haja correspondência na tabela B tecnicamente se chama OUTER JOIN, e é uma situação COMUM AO EXTREMO num database relacional…. No caso do RDBMS Oracle, como ele introduziu essa possibilidade láááá atrás na versão 6 (muito muito antes do comitê ANSI padronizar essa operação na linguagem SQL) ele apresentou uma sintaxe própria, que é o operador (+) e com ele a regra é que vc coloca o (+) no lado DEFICIENTE do WHERE, ie, na(s) coluna(s)-chave que NÃO TEM correspondência…. Evidentemente, esse operador serve perfeitamente para casos simples, onde o registro de A não existe em B : uma situação onde TANTO pode ter registros e A inexistentes em B QUANTO registros em B faltantes em A (o chamado FULL OUTRE JOIN) aí não seria atendida, e num caso assim vc teria que apelas pra UNIONs ou para os novos comandos de junção padronizados pelo comitê ANSI (e que o Oracle atendeu também), onde vc usa o comando JOIN : no caso, estou ASSUMINDO que é ESSA a sua necessidade, é um OUTER JOIN simples, então vou de (+) mesmo – CONFIRA que realmente é ESSE o teu caso, veja lá se não tem MESMO outras tabelas participantes do JOIN que precisa se fazer OUTER também…
Antes e mais nada vou criar duas tabelinhas pra simular a sua necessidade, e já adianto que não vou me preocupar com teu SQL original que faz join de 9 tabelas : vou criar um caso SIMPLIFICADO aqui, sim sim ??? Vai caber a você o adaptar pra sua necessidade… Segue :SYSTEM:@XE:SQL>CREATE TABLE TAB_A (NR_SEQ_EXAME number, DS_EXAME varchar2(200));
Tabela criada.
SYSTEM:@XE:SQL>CREATE TABLE TAB_B (NR_SEQ_EXAME number, STATUS_EXAME varchar2(25));
Tabela criada.
SYSTEM:@XE:SQL>insert into TAB_A values(1233,’Hemograma’);
1 linha criada.
SYSTEM:@XE:SQL>insert into TAB_A values(1234,’Malaria’);
1 linha criada.
SYSTEM:@XE:SQL>insert into TAB_A values(1235,’Toxoplasmose’);
1 linha criada.
SYSTEM:@XE:SQL>insert into TAB_A values(1236,’Ultrassom’);
1 linha criada.
SYSTEM:@XE:SQL>insert into TAB_B values(1233,’Realizado’);
1 linha criada.
SYSTEM:@XE:SQL>insert into TAB_B values(1234,’Realizado’);
1 linha criada.
SYSTEM:@XE:SQL>commit;
Commit concluído.
SYSTEM:@XE:SQL>
==> Só vou dar uma formatadinha no meu programa-cliente, o sqlplus, pra melhor visualização :
SYSTEM:@XE:SQL>column “DESCRIÇÃO DO EXAME” format a44
SYSTEM:@XE:SQL>set lines 130==> Observe que como é a tabela B que pode ter registros faltantes em relação à tabela A que vai estar ‘completa’, é do lado B do WHERE que vai estar o (+) :
SYSTEM:@XE:SQL>select a.NR_SEQ_EXAME, a.DS_EXAME “DESCRIÇÃO DO EXAME”, b.STATUS_EXAME “STATUS”
2 from TAB_A a, TAB_B b
3 where a.NR_SEQ_EXAME = b.NR_SEQ_EXAME (+) — <Blz ?
[]s
Chiappa
1 de julho de 2018 às 4:26 am #109300JanainaParticipanteChiappa boa noite obrigada.
Deu certo, eu estava utilizando o (+) de forma errada.
Obrigada pelas explicações.Att,
Janaina 🙂2 de julho de 2018 às 8:32 pm #109301José Laurindo ChiappaModeradorJóia, fico contente de poder ter ajudado…
Abraços,
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.