Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 4 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #109298
    Avatar de JanainaJanaina
    Participante

      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 Ultrassom

      TABELA B

      Sequencia Exame Status Exame
      1233 Hemograma Realizado
      1234 Malaria Realizado

      RETORNO 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_RECONV

      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’

      ——————————————————————————

      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!
      Janaina

      Attachments:
      #109299
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Tudo 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

        #109300
        Avatar de JanainaJanaina
        Participante

          Chiappa boa noite obrigada.
          Deu certo, eu estava utilizando o (+) de forma errada.
          Obrigada pelas explicações.

          Att,
          Janaina 🙂

          #109301
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Jóia, fico contente de poder ter ajudado…

            Abraços,

            Chiappa

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress