SQL com cláusula EXISTS

Olá tudo bem?

Este SQL funciona muito bem, entretanto, se insiro duas datas para um mesmo funcionario na tabela ele apresenta as duas na minha página jsp.

Eu quero que retorne somente as datas de um determinado mês, por exemplo, mês 01

select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘GEASE’
order by d.nome

Sendo assim, eu estou tentando fazer este SQL utilizando a cláusula EXISTS, mas não está muto fácil. Você pode me ajudar?

Aqui está o que estou tentando fazer:

select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
exists( a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’
)

Caso eu consiga a resposta através dos meus testes, vou postar assim que consiguir, ok.

Obrigado por sua atenção

Consegui apresentar somente as pessoas que possuem data inicio referente ao mês 01, entretanto, as pessoas que ainda não informaram a data não estão aparecendo, mas elas também devem aparecer no relatório.

ALGUÉM TEM UMA IDÉIA?

select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’

OBRIGADO POR SUA ATENÇÃO E FELIZ NATAL!

…OR e.dataInicio = NULL? :smiley:

Caramba CV, como é que eu não pensei nisso

Só que funcional da seguinte forma : is null

          select       
               d.matricula, d.nome, e.dataInicio, e.dataTermino   
          from                                               
             gerencias a left outer join divisoes b    
          on                                          
             a.pref_gerencia = b.pref_gerencia   
          left outer join    
              equipes c   
          on   
              b.cod_divisao = c.cod_divisao   
          left outer join    
             funcionarios d   
          on   
             c.cod_equipe = d.cod_equipe   
          left outer join    
            escalaFerias e   
          on   
             d.matricula = e.matricula
          where                  
            a.sigla = 'gease'    
          and
            MONTH(e.dataInicio) = '01'
          OR 
            e.dataInicio is null

Valeu mesmo CV!

Xiiiiiiiiiiiiii galera melou…

Deu errado uma coisa

Se eu colocar is null, ele apresenta todos os funcionários inclusive a galera que não tem nada haver com o relacionamento

CV o que devo fazer?

Obrigado por sua atenção!

CV TEM UM DETALHE

Utilizando

          or
            e.dataInicio = null

não mudou em nada o resultado do sql

apenas se eu utiliza is null e que me apresenta informação, entretanto, como já disse trás uma galera que não tem nada haver com a parada

quando vc lança uma data para mesmo funcionario em meses diferentes, ele ainda vem. mesmo passando o fornecendo o parametro de mes=01?

E isso mesmo mbjunior

Mas além disso ele também está apresentando nome de funcionários que não fazem parte da gerencia “gease” solicitada, ou seja, ele está listando todo mundo da tabela

O que devo fazer?

mbjunior

SO UM EXCLARECIMENTO

Ele não apresenta datas diferentes para uma mesma pessoa, tal como voce perguntou , entretanto, está listando a tabela inteira com data ou sem data de inicio e fim

Valeu!

Quando eu utilizo este SQL ele me apresenta a tabela logo abaixo, entretanto
com a Eliane C possui duas datas mes 01 e mes 07 para dataInicio.

           select       
               d.matricula, d.nome, e.dataInicio, e.dataTermino   
          from                                               
             gerencias a left outer join divisoes b    
          on                                          
             a.pref_gerencia = b.pref_gerencia   
          left outer join    
              equipes c   
          on   
              b.cod_divisao = c.cod_divisao   
          left outer join    
             funcionarios d   
          on   
             c.cod_equipe = d.cod_equipe   
          left outer join    
            escalaFerias e   
          on   
             d.matricula = e.matricula   
          where   
            a.sigla =  'GEASE'                                               
       order by d.nome                                                       

Nº codigo nome dataInicio dataTermino
1 19237707 Cassio
2 27887057 Elaine C 2004-07-15 2004-08-15
3 27887057 Elaine C 2004-01-15 2004-02-10
4 28048687 Eliana
5 3878100X Gustavo 2004-01-10 2004-02-10
6 48126071 Joao
7 51557096 Jorge
8 62521543 Libia
9 64588629 Luiz
10 68331770 Maria
11 70063567 Marta
12 80229557 Paola
13 93950500 Uilson

QUando utilizo este segundo SQL ele apresenta somente dois registros conforme abaixo

select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’

27887057 Elaine C 2004-01-15 2004-02-10
3878100X Gustavo 004-01-10 2004-02-10

ENTRETANTO, ALÉM desses dois registros eu tenho mais 10 pessoas que fazem parte da “gease”,
mas elas não estão aparecendo na listagem.

Esse é o meu problema!

meu velho,
repara só…
não existem tabelas que vc esteja relacionando que esteja faltando campos de relacionamento? tipo:

vc tem tal estrutura:

tb_aluno
id
nome
turma

tb_disciplina
id
descricao

tb_nota
aluno_id
disciplina_id
nota

se vc não fizer um sql com todos relacionamentos certos o SGBD fará um produto cartesiano dos registros das tabelas referenciadas.

Exemplo basico:

dados:
TB_ALUNO
1 - MBJUNIOR - A
2 - SANDRO - B

TB_DISCIPLINA
1 - SO
2 - BD

TB_NOTA
1 - 1 - 7,5
1 - 2 - 5
2 - 1 - 8
2 - 2 - 7

SQL que gerará produto cartesiano:

SELECT A.NOME, A.TURMA, D.DESCRICAO, N.NOTA
FROM TB_ALUNO A, TB_DISCIPLINA D, TB_NOTA N
WHERE ( A.ID = N.ALUNO_ID ) AND
           ( A.TURMA = 'B')

se pode perceber que relacionamentos entre as tabelas estão FALTANDO…
como “D.ID = N.DISCIPLINA_ID”.
e isso fará com que todos cada registro vindo do sql seja “combinado” com todos os registros das tabelas envolvidas no select.

o que irá trazer alunos que pertencem a turma ‘A’ mesmo q não esteja na cláusula de condição.

se não for isso…
tenta usar um DISTINCT.

espero ter ajudado…
Qualquer coisa estamos na área…

vc tem essas dez pessoa que fazem parte do grupo “gease”…
e essas pessoas possuem dataInicio=01???

mbjunior, vou dar uma olhada no relacionamento. mas as tabelas estão corretas.

Depois eu volto para dizer se deu certo ok

Cada uma das dez pessoas podem escolher o dia de início que desejar para sair de férias.

Até mais !

[quote=“sandrodantas”]

QUando utilizo este segundo SQL ele apresenta somente dois registros conforme abaixo

select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’

27887057 Elaine C 2004-01-15 2004-02-10
3878100X Gustavo 004-01-10 2004-02-10

ENTRETANTO, ALÉM desses dois registros eu tenho mais 10 pessoas que fazem parte da “gease”,
mas elas não estão aparecendo na listagem.

Esse é o meu problema![/quote]

Não sei se entendi exatamente o problema, e provavelmente a esta altura do campeonato vc já deve ter resolvido tb ! :wink:

Mas pelo o que vi da sua tabela, esses são os dois únicos funcionários que atendem ao critério: “gerencia = ‘grease’ and month = 1”.

Se vc colocar um critério “or isnull” vão aparecer todos da gerência grease:

WHERE
  (a.sigla = 'gease')
AND
  (MONTH(e.dataInicio) = '01' 
OR
  is null e.dataInicio);

Espero que tenha ajudado! 8)

Abraços.