coletar dados do "AND EXISTS" E EXIBIR NO SELECT P

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

ESTOU COM O SEGUINTE PROBLEMA TENHO UM SELECT QUE ESTA ME TRAZENDO OS REGISTROS DE FORMA CORRETA, POREM PRECISO EXIBIR OS CAMPOS DA TABELA SIA.CARNE CN NOS MEUS RESULTADOS MAS ESTOU ME EMBOLANDO PARA fazer-LO SERÁ QUE alguém PODERIA DAR UMA FORÇA. GRATO.
SEGUE ABAIXO A QUERY.

Selecionar tudo

SELECT   CA.COD_CAMPUS
       , CA.NOM_CAMPUS
       , C.COD_CURSO
       , C.NOM_CURSO
       , AC.COD_MATRICULA
       , AL.NOM_ALUNO
       , SAC.NOM_SITUACAO_ALUNO
       , TP.NOM_TIPO_CURSO
       , AC.NUM_SEQ_ALUNO_CURSO
FROM SIA.ALUNO_CURSO AC
     , SIA.ALUNO AL
     , SIA.CAMPUS CA
     , SIA.CURSO C
     , SIA.SITUACAO_ALUNO_CURSO SAC
     , SIA.TIPO_CURSO TP
     

WHERE AC.NUM_SEQ_ALUNO = AL.NUM_SEQ_ALUNO
  AND AC.COD_CAMPUS_ATUAL = CA.COD_CAMPUS
  AND AC.COD_CURSO_ATUAL = C.COD_CURSO
  AND AC.COD_SITUACAO_ALUNO = SAC.COD_SITUACAO_ALUNO
  AND C.COD_TIPO_CURSO = TP.COD_TIPO_CURSO
  AND C.COD_TIPO_CURSO IN (14,4,11)
  AND AC.COD_SITUACAO_ALUNO IN(4) -- 4 = FORMADO
  AND EXISTS (SELECT 1 FROM SIA.HISTORICO_ALUNO_CURSO HAC
              WHERE HAC.NUM_SEQ_ALUNO_CURSO = AC.NUM_SEQ_ALUNO_CURSO
                AND HAC.COD_TIPO_HISTORICO_ALUNO IN(19,25,26)
                AND HAC.NUM_SEQ_PERIODO_ACADEMICO IN(SELECT NUM_SEQ_PERIODO_ACADEMICO
                                      FROM SIA.PERIODO_ACADEMICO PA1
                                      WHERE PA1.COD_TIPO_CURSO IN(4,11)
                                      AND PA1.DT_FIM_PERIODO >= TO_DATE('01/06/2009','DD/MM/YYYY')
                                      AND EXISTS (
                                                          SELECT 1
                                                            FROM SIA.CARNE CN -- TABELA DE BOLETOS
                                                          WHERE CN.NUM_SEQ_ALUNO_CURSO = AC.NUM_SEQ_ALUNO_CURSO
                                                              AND CN.DT_mês_ANO_COMPETENCIA >= PA1.DT_FIM_PERIODO
                                                             AND CN.IND_SITUACAO_CARNE <> '3' -- DIFERENTE DE CANCELADO
                                                            AND CN.IND_TIPO_CARNE IN ('3','6') -- CARNE DE MENSALIDADE OU RENOVAÇÃO/REABERTURA
                                                          )
)
                                        )
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Cara, se tu faz vários EXISTS um dentro do outro é porque os retornos serão de mais de uma linha, certo?
Se sim, tu poderia adicionar as tabelas na join da query principal, mas mudaria o teu retorno.
Ou tu poderia criar uma função fixando o retorno em única linha.
Ficaria algo assim:

Selecionar tudo

SELECT *
  FROM (SELECT ca.cod_campus
              ,ca.nom_campus
              ,c.cod_curso
              ,c.nom_curso
              ,ac.cod_matricula
              ,al.nom_aluno
              ,sac.nom_situacao_aluno
              ,tp.nom_tipo_curso
              ,ac.num_seq_aluno_curso
              ,funcao_bla_bla_bla alias_qualquer
          FROM sia.aluno_curso ac
              ,sia.aluno al
              ,sia.campus ca
              ,sia.curso c
              ,sia.situacao_aluno_curso sac
              ,sia.tipo_curso tp
         WHERE ac.num_seq_aluno = al.num_seq_aluno
           AND ac.cod_campus_atual = ca.cod_campus
           AND ac.cod_curso_atual = c.cod_curso
           AND ac.cod_situacao_aluno = sac.cod_situacao_aluno
           AND c.cod_tipo_curso = tp.cod_tipo_curso
           AND c.cod_tipo_curso IN (14, 4, 11)
           AND ac.cod_situacao_aluno IN (4))
 WHERE alias_qualquer IS NOT NULL
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

meu retorno é de varias linhas, deixe-me tentar passar mais ou menos o que essa query faz, então, eu quero saber quais das pessoas tiveram boletos emitidos apois sua formatura que se encontra nessa linha

Selecionar tudo

AND CN.DT_mês_ANO_COMPETENCIA >= PA1.DT_FIM_PERIODO
então as pessoas podem ter mais de 1 boleto gerado, sendo que quero saber somente quem tem boleto gerado e a data de geracao de boleto( que é ai que o negocio pega) a data de geracao do boleto esta dentro da tabela "carne" que esta dentro do in. então eu teria que declarar denovo a tabela no select principal e chamar o campo, sendo que se eu fizer o relacionamento teria que ser

Selecionar tudo

campo_data_da_tabela_carne > que campo_data_da_tabela_historico
Pois quero quem teve boleto gerado apos se formar.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Então adiciona todas as tabelas dos teus EXISTS na tua query principal.
Deve funcionar.
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

já fiz isso mas fica repetindo varias vezes os registros mesmo eu agrupando as tabelas tem uns relacionamentos que são repetidos inumeras vezes.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Posta scripts pra criação de tabelas, inserts e como deve ser o teu retorno.
Fica mais fácil de ajudar.
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

DEIXA EU RESUMIR
SEGUE O CÓDIGO

Selecionar tudo

AND CN.DT_mês_ANO_COMPETENCIA > (SELECT PA1.DT_INI_PERIODO  
                                    FROM SIA.PERIODO_ACADEMICO PA1
                                    WHERE PA1.COD_TIPO_CURSO IN(4,11)
                                    AND PA1.DT_INI_PERIODO BETWEEN TO_DATE('01/01/2010','DD/MM/YYYY')
                                    AND TO_DATE('30/06/2010','DD/MM/YYYY')
                                    AND HAC.COD_TIPO_HISTORICO_ALUNO IN(19,26),'DD/MM/YYYY')
onde estou fazendo uma consulta no banco de dados e quero que cn.dt_mês_ano_competencia seja menor que aquele resultado do select sendo que gostaria que ele comparasse linha por linha mas gera um erro dizendo que tem mais de uma linha na subquerie para comparar. Como posso comparar essas datas de campos de tabelas diferentes ?
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Selecionar tudo

AND CN.DT_mês_ANO_COMPETENCIA > (SELECT PA1.DT_INI_PERIODO  
                                    FROM SIA.PERIODO_ACADEMICO PA1 
                                    WHERE PA1.COD_TIPO_CURSO IN(4,11) 
                                    AND PA1.DT_INI_PERIODO BETWEEN TO_DATE('01/01/2010','DD/MM/YYYY') 
                                    AND TO_DATE('30/06/2010','DD/MM/YYYY') 
                                    AND HAC.COD_TIPO_HISTORICO_ALUNO IN(19,26)
																		AND ROWNUM = 1)
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

E EU TENTANDO AQUI USAR O TOP E não IA DE JEITO NENHUM HAHAHA. MAS beleza POR ENQUANTO TA RESOLVIDO, MUITO OBRIGADO MEU AMIGO !
ccadu
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Sex, 20 Ago 2010 10:44 am
Localização: Rio de Janeiro - RJ
Carlos Eduardo
Rio de Janeiro - RJ

AINDA não TERMINEI MAS RESOLVI MUDAR E PEGUEI OUTRO CAMPO REFERENCIA OLHE COMO ESTA, SEGUI SUA SUGESTAO TE TIRAR DO EXISTS E COLOQUEI NO SELECT PRINCIPAL ESSE RELACIONAMENTO DAQUI É MEIO DOIDO, TOMEI UMA SURRA MAS ESTOU CONSEGUINDO AGORA, FALTA POUCO.

Selecionar tudo

SELECT  -- IE.NOM_INSTITUICAO
        CA.COD_CAMPUS
       , CA.NOM_CAMPUS
       , C.COD_CURSO
       , C.NOM_CURSO
       , AC.COD_MATRICULA
       , AL.NOM_ALUNO
       , SAC.NOM_SITUACAO_ALUNO
       , AC.DT_COLACAO_GRAU
       , CN.VAL_A_PAGAR
       , CN.NUM_SEQ_CARNE
       , CN.DT_VENCIMENTO
       
      -- , HAC.NUM_SEQ_ALUNO_CURSO
    --   , PA1.NUM_SEQ_PERIODO_ACADEMICO
FROM   SIA.ALUNO_CURSO AC
     , SIA.ALUNO AL
     , SIA.CAMPUS CA
     , SIA.CURSO C
     , SIA.SITUACAO_ALUNO_CURSO SAC
     , SIA.TIPO_CURSO TP
   --  , SIA.INSTITUICAO_ENSINO IE 
 --    , SIA.PERIODO_ACADEMICO PA1 *
    , SIA.CARNE CN
    , SIA.HISTORICO_ALUNO_CURSO HAC 
WHERE AC.NUM_SEQ_ALUNO = AL.NUM_SEQ_ALUNO
  AND AC.COD_CAMPUS_ATUAL = CA.COD_CAMPUS
  AND AC.COD_CURSO_ATUAL = C.COD_CURSO
  AND AC.COD_SITUACAO_ALUNO = SAC.COD_SITUACAO_ALUNO
  AND C.COD_TIPO_CURSO = TP.COD_TIPO_CURSO
 -- AND IE.COD_INSTITUICAO = CA.COD_INSTITUICAO
--  AND PA1.COD_TIPO_CURSO = TP.COD_TIPO_CURSO
    AND CN.NUM_SEQ_ALUNO_CURSO = AC.NUM_SEQ_ALUNO_CURSO
 -- AND CN.NUM_SEQ_PERIODO_ACADEMICO = PA1.NUM_SEQ_PERIODO_ACADEMICO
  AND HAC.NUM_SEQ_ALUNO_CURSO = AC.NUM_SEQ_ALUNO_CURSO
  AND HAC.COD_CAMPUS_ATUAL = CA.COD_CAMPUS (+)
  AND HAC.COD_CURSO_ATUAL = C.COD_CURSO (+)
  AND HAC.NUM_SEQ_PERIODO_ACADEMICO IN(SELECT NUM_SEQ_PERIODO_ACADEMICO
                                       FROM SIA.PERIODO_ACADEMICO PA1
                                       WHERE PA1.COD_TIPO_CURSO IN(4,11)
                                       AND PA1.DT_INI_PERIODO < TO_DATE('01/01/2010','DD/MM/YYYY')
                                       AND HAC.COD_TIPO_HISTORICO_ALUNO IN(19,26))
  AND C.COD_TIPO_CURSO IN (14,4,11)
  AND AC.COD_SITUACAO_ALUNO IN(4) -- 4 = FORMADO
  AND CN.IND_SITUACAO_CARNE <> 3
 -- AND CN.IND_TIPO_CARNE IN ('3','6')
  AND CN.IND_TIPO_BAIXA = 12
  AND CN.DT_mês_ANO_COMPETENCIA >= AC.DT_COLACAO_GRAU
  AND ROWNUM = 1
  ORDER BY AC.COD_MATRICULA

NELE ESTOU PEGANDO TODOS OS ALUNOS QUE TIVERAM BOLETOS EMITIDOS APOS SUA FORMATURA ATE O FINAL DE 2009 E AINDA não FOI BAIXADO POR ALGUM MOTIVO.
OBRIGADO POR TUDO E PELA ATENÇÃO
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes