Usuário com melhor resposta
Ajuda com SELECT

Pergunta
-
Galera, bom dia.
Estou enfrentando um problema durante um select de informações em 7 tabelas distintas.
Meu cenário é o seguinte, estou utilizando uma base que é um colégio, e preciso buscar informações referentes ao histórico de cada aluno durante os anos (2012, 2013, 2014, 2015, 2016). No entando meu select parece estar duplicando os campos e me trazendo um número gigantesco de registros mesmo eu utilizando a clausula DISTINCT. Cada aluno deve ter mais ou menos 100 registros por ano, com o select que fiz, um único aluno me trouxe 300.000 linhas.
Caso algum de vocês consiga me ajudar a aperfeiçoar esse select eu ficaria muito grato. Segue abaixo:
USE (minha base)
select DISTINCT TC.idcurso, TC.nomecurso,
TS.idserie, TS.nomeserie,
TP.siglaperiodo,
TT.idturma,
TA.idaluno, TA.nomealuno, TA.matricula,
TEE.idestabelecimentoensino, TEE.nomeestabelecimento, TEE.cidade, TEE.Estado,
TH.resultadofinal, TH.diasletivos, TH.observacao,
TD.iddisciplina, TD.nomedisciplina, TD.CodigoAgrupamento, TD.TipoDisciplina,
TFA.nota01,
TD.ES_CargaHoraria, TD.NumeroOrdemHistorico
from TbCurso AS TC
INNER JOIN TbSerie AS TS
ON TS.IdCurso = TC.IdCurso
INNER JOIN TbPeriodo AS TP
ON TP.IdUnidade = TC.IdUnidade
INNER JOIN TbTurma AS TT
ON TP.IdPeriodo = TT.IdPeriodo
INNER JOIN TbAluno AS TA
ON TA.IdUnidade = TP.IdUnidade
INNER JOIN TbHistorico AS TH
ON TH.IdAluno = TA.IdAluno
INNER JOIN TbEstabelecimentoEnsino AS TEE
ON TEE.IdEstabelecimentoEnsino = TH.IdEstabelecimentoEnsino
INNER JOIN TbFaseNotaAluno AS TFA
ON TFA.IdAluno = TA.IdAluno
INNER JOIN TbDisciplina AS TD
ON TD.IdDisciplina = TFA.IdDisciplina
where TP.siglaperiodo = '2016'
order by TA.idaluno
Desde já agradeço a atenção de todos.
Respostas
-
Deleted
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator quinta-feira, 14 de setembro de 2017 18:58
Todas as Respostas
-
Deleted
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator quinta-feira, 14 de setembro de 2017 18:58
-
Boa tarde Jose,
Então, as relações das tables eu tirei através do Design da base, esse banco na verdade não é meu, estou apenas prestando serviço de coletar informações. Respondendo suas perguntas:
O valor da coluna idAluno é sempre o mesmo, durante todos os anos em que o aluno estudou no colégio? Sim, o aluno X sempre terá o mesmo ID.
O código de matrícula dele é sempre o mesmo, durante todos os anos em que o aluno estudou no colégio? Sim, o aluno X sempre terá o mesmo nº de matricula.
Qual a a diferença entre série e período? Série é o registro do curso que o aluno está (ex: 1 série, maternal, jardim) já o período é o ano em que o aluno está cursando a série ( ex: 2017 - aluno X - cursando 3º do Colegial)
O aluno faz parte de uma turma? Sim, a turma é a sala em que o aluno estava durante o período e a série X.Sem o distinct os registros praticamente triplicaram, de 300.000 foi pra 790.000 registros. Percebi tambem que todos os campos ficam identicos, e somente o campo NOTA é alterado, segue abaixo:
idcurso nomecurso idserie nomeserie siglaperiodo idturma idaluno nomealuno matricula idestabelecimentoensino nomeestabelecimento cidade Estado resultadofinal diasletivos observacao iddisciplina nomedisciplina CodigoAgrupamento TipoDisciplina nota01 ES_CargaHoraria NumeroOrdemHistorico 4 Ensino Médio 3 1ª Série 2016 858 2 BARBARA CRISTINE RODRIGUES DE AGUIAR 2659 58 Instituto Santa Maria Mazzarello Recife PE A 200 NULL 1 Língua Portuguesa NULL 1 7.5 NULL NULL 4 Ensino Médio 3 1ª Série 2016 858 2 BARBARA CRISTINE RODRIGUES DE AGUIAR 2659 58 Instituto Santa Maria Mazzarello Recife PE A 200 NULL 1 Língua Portuguesa NULL 1 8 NULL NULL 4 Ensino Médio 3 1ª Série 2016 858 2 BARBARA CRISTINE RODRIGUES DE AGUIAR 2659 58 Instituto Santa Maria Mazzarello Recife PE A 200 NULL 1 Língua Portuguesa NULL 1 8.5 NULL NULL 4 Ensino Médio 3 1ª Série 2016 858 2 BARBARA CRISTINE RODRIGUES DE AGUIAR 2659 58 Instituto Santa Maria Mazzarello Recife PE A 200 NULL 1 Língua Portuguesa NULL 1 9 NULL NULL 4 Ensino Médio 3 1ª Série 2016 858 2 BARBARA CRISTINE RODRIGUES DE AGUIAR 2659 58 Instituto Santa Maria Mazzarello Recife PE A 200 NULL 1 Língua Portuguesa NULL 1 9.5 NULL NULL
-
-
Jose, fiz o relacionamente entre as PK e FK das tabelas. Porem o arquivo ficou muito grande, teria como me adicionar no Skype, ou me passar seu e-mail? Se possivel segue abaixo meus contatos:
skype: Lucas - Innovent Solutions
e-mail: lucas.pinheiro@innoventsolutions.com.br
Desde já agradeço a atenção cara.
At.
- Editado lu_pinheiro segunda-feira, 11 de setembro de 2017 14:12
-
lu, dependendo da quantidade de registro que tenha na histórico por aluno, pode justificar esses vários registros. Essas tabelas que guardam históricos provocam esses tipos de resultados. Já tentou tirá-la e ver como fica?
Dependendo do objetivo da tabela e da consulta. Pode ser que apenas o último registro, por ano, seja relevante.
-
Então, na tabela histórico existem 21.600 registros, já na tabela aluno 5.620, peguei a relação das chaves primarias e estrangeiras nas tabelas onde estou realizando a junção, uma duvida, eu preciso realizar o INNER JOIN mais de uma vez quando existir mais de 1 FK nas tabelas?
Por exemplo,
from TbCurso AS TC
INNER JOIN TbSerie AS TS
ON TS.IdCurso = TC.IdCursose houver mais campos iguais nas 2 tabelas, eu preciso aponta-los?
- Editado lu_pinheiro segunda-feira, 11 de setembro de 2017 18:23
-
-
Lu_Pinheiro,
Mas se você for tomar como base a quantidade de chaves estrangeiras para relacionar, provavelmente o retorno das linhas não será o desejado.
Não seria o caso de realmente analisar os relacionamentos que estão sendo impostos neste momento?
Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]