Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bichopapo

Select com left join

Recommended Posts

Olá pessoal

estou tentando fazer um select mas não estou chegando no resultado esperado

tenho uma tabela chamada REMANEJAMENTOS e uma outra chamada ALUNOS

quando troco o aluno de turma, e criado um registro na tabela remanejamentos, indicando de qual turma ele saiu e para que turma ele foi... sendo assim, todas as trocas de turmas ficam guardadas. Na tabela alunos, é feito um update, mudando para a turma atual

tabelas.jpg

preciso de um select que me retorne a relacao de alunos da turma 30... juntamente com os alunos que já foram um dia da turma 30, ou seja, os alunos que tem na tabela remanejamento com a coluna DE = 30..

resumindo, vai retornar os alunos da turma 30, inclusive os que já foram dessa e turma e sairam para outras turmas

tabelas2.jpg

observem que os alunos 300 e 400 não pertecem mais a essa turma, mas um dia foram dela... isso e indicado na tabela remanejamentos na coluna DE, onde guarda a turma que o aluno saiu...

com esse codigo quase consegui... na verdade o resultado foi quase satisfatorio,

select 

al.id_aluno, 
al.aluno,
al.turma,
re.id,
re.de,
re.para

from

alunos al
 left join
remanejamentos re
on al.id_aluno = re.id_aluno

where


(re.de = 30)
or
(
(al.turma = 30) 

observem que ele fez exatamente o q pedi, com uma pequena exceção... a aluna AMANDA, saiu da turma 30 e foi para a turma 40... depois ela voltou da 40 para a turma 30... no select que consegui, o nome dela aparece duas vezes... so preciso que apareca uma vez, ou seja, o ULTIMO registro feito para ela na tabela remanejamentos... pois como ela já é da turma 30, não preciso dos registros q ela saiu e voltou...

 

tabelas3.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola Motta, obrigado pela ajuda

 

Não poderia usar o MAX no ID do remanejamento???? pegando o ultimo.... ou se criando um status para o remanejamento, dessa maneira, toda vez que remanejar um aluno, o status dos outros remanejamentos fica 0 e somento o ultimo feito fica 1... assim teriamos remanejamentos ativos e inativos... sei la, so uma ideia que surgiu aqui

 

Na minha tabela remanejamento tem sim uma data que ele foi remanejado, mas nao coloquei no exemplo por achar que nao seria necessário...

 

como ficaria então com a data? tentei algumas coisas aqui mas nao funcionaram...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria uma view que unisse um select de alunos e outro com alunos e remanejamentos,
As consultas seriam nesta view com a possibilidade até de respondervem que data eram os alunos da turma x.

Mas para obter o max basta fazer um subselect com a mesma query do post #1


select al.id_aluno, al.aluno, al.turma, re.id, re.de, re.para
from alunos al
   left join remanejamentos re
         on al.id_aluno = re.id_aluno
where ( (re.de = 30) or ( (al.turma = 30) )
and re.id = (select max(re2.id
             from remanejamentos re2
             where re2.id_aluno = re.id_aluno)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Motta,

 

fiz como sugeriu, mas retornou apenas os remanejamentos... nao retornou os alunos que não aparecem na tabela remanejamentos....

 

como ficaria a sugestão q vc deu acima?

Eu faria uma view que unisse um select de alunos e outro com alunos e remanejamentos,"

Compartilhar este post


Link para o post
Compartilhar em outros sites

De, fato.

Estou num tablet ruim de ditar, amanhã se tiver tempo tento editar uma solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução que me ocorre, não sei se de boa performance

select al.id_aluno, al.aluno, al.turma, re.id, re.de, re.para
from alunos al
left join remanejamentos re
on al.id_aluno = re.id_aluno
where ( (re.de = 30) or ( (al.turma = 30) )
and ( (re.id is null) 
      or
      (re.id = (select max(re2.id
             from remanejamentos re2
             where re2.id_aluno = re.id_aluno)) )

mas deve ter solução melhor

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.