- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 8 anos, 4 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
23 de julho de 2016 às 9:05 pm #108309JorgeParticipante
Boa tarde amigos!
Estou com a seguinte dúvida,
alguém sabe como eu faço para pegar uma linha da tabela que podemos chamar de Aluno e fazer uma consulta em outra tabela que podemos chamar de Avaliação e retornar um campo desta Avaliação?
Vamos ao exemplo:
Tabela ALUNO
Nome História Matemática Geografia
João Sim Sim Sim
José Não Sim NãoTabela AVALIACAO
RESULTADO História Matemática Geografia
APROVADO Sim Sim Sim
REPROVADO Não Não Não
REPROVADO Sim Não Sim
REPROVADO Não Sim Sim
REPROVADO Sim Sim Não
REPROVADO Não Sim NãoBom amigos, este é o exemplo!
Gostaria de pegar a linha da tabela ALUNO, por exemplo a do Aluno José e consultar na tabela AVALIACAO e retornar se este aluno foi aprovado ou não.Minha lógica foi, tentar usar o CASE WHEN, mas não obtive sucesso!
Mas não consigo relacionar essas duas tabelas por não terem um campo chave.
Tem como eu fazer esta consulta?25 de julho de 2016 às 6:07 pm #108310Paulo WerneckParticipanteCara se a estrutura das tabelas forem assim mesmo como vc pos no exemplo, isso é um erro grotesco de modelagem.
Não vejo um forma de fazer uma query em cima desse modelo de dados, a não ser normalizando.
25 de julho de 2016 às 8:05 pm #108313José Laurindo ChiappaModeradorColega, a sua resposta é SIM, é totalmente Possível (tecnicamente falando) que vc faça um JOIN (esse é o termo técnico correto para vc pesquisar dados entre múltiplas tabelas, q é o que vc quer) SEM que as colunas aonde a informação a relacionar (e que Portanto se repetem em todas as tabelas interligadas) sejam definidas como Chaves, vou dar o exemplo abaixo : é ÓBVIO que a Recomendação, que a MELHOR PRÁTICA dita que hajam as definições de Chaves presentes, mas isso Não É Obrigatório tecnicamente falando ao pé da letra….
PORÉM, antes de responder eu TENHO QUE DIZER que essa modelagem que vc usa no exemplo é COMPLETAMENTE INAPROPRIADA, pois (entre outros fatores) se vc for precisar incluir mais matérias vc vai ter que incluir novas colunas : isso é uma Violação Direta tanto à terceira Forma Normal quanto às definições de RDBMS, que Exigem que a estrutura física / quantidade de colunas seja Independente da lógica de busca e que Preferencialmente sejam Estáticas…. Com TOTAL CERTEZA se eu estivesse num ambiente Profissional trabalhando com um modelo assim eu o rejeitaria de cara….Isso posto, o exemplo :
SQL> create table ALUNO (
2 Nome varchar2(20 CHAR),
3 Historia varchar2(3 CHAR),
4 Matematica varchar2(3 CHAR),
5 Geografia varchar2(3 CHAR)
6 );Table created.
SQL> insert into ALUNO values(‘João’, ‘Sim’, ‘Sim’, ‘Sim’);
1 row created.
SQL> insert into ALUNO values(‘José’, ‘Não’, ‘Sim’, ‘Não’);
1 row created.
SQL> create table AVALIACAO(
2 RESULTADO varchar2(10 CHAR),
3 Historia varchar2(3 CHAR),
4 Matematica varchar2(3 CHAR),
5 Geografia varchar2(3 CHAR)
6 );Table created.
SQL> insert into AVALIACAO values(‘APROVADO’, ‘Sim’, ‘Sim’, ‘Sim’);
1 row created.
SQL> insert into AVALIACAO values(‘REPROVADO’, ‘Não’, ‘Não’, ‘Não’);
1 row created.
SQL> insert into AVALIACAO values(‘REPROVADO’, ‘Sim’, ‘Não’, ‘Sim’);
1 row created.
SQL> insert into AVALIACAO values(‘REPROVADO’, ‘Não’, ‘Sim’, ‘Sim’);
1 row created.
SQL> insert into AVALIACAO values(‘REPROVADO’, ‘Sim’, ‘Sim’, ‘Não’);
1 row created.
SQL> insert into AVALIACAO values(‘REPROVADO’, ‘Não’, ‘Sim’, ‘Não’);
1 row created.
SQL> select * from ALUNO;
NOME HIS MAT GEO
João Sim Sim Sim
José Não Sim NãoSQL> select * from AVALIACAO;
RESULTADO HIS MAT GEO
APROVADO Sim Sim Sim
REPROVADO Não Não Não
REPROVADO Sim Não Sim
REPROVADO Não Sim Sim
REPROVADO Sim Sim Não
REPROVADO Não Sim Não6 rows selected.
SQL>
==> Dá pra perceber que a informação que se repete nas duas tabelas é a combinação das colunas História, Matemática e Geografia, PORTANTO é com elas que vc vai montar o relacionamento, que vai ser de Igualdade de acordo com o exemplo…. Ainda de acordo com o Exemplo, SUB-ENTENDE-SE que a Regra que define aluno com resultado APROVADO é ter ‘Sim’ nas 3 colunas de relacionamento em AMBAS as tabelas, então ISSO é o que codificarei :
SQL> select ALU.nome, AVA.resultado, AVA.Historia, AVA.Matematica, AVA.Geografia
2 from ALUNO ALU, AVALIACAO AVA
3 where AVA.Historia = ‘Sim’
4 and AVA.Matematica = ‘Sim’
5 and AVA.Geografia = ‘Sim’
6 and ALU.historia = AVA.historia
7 and ALU.Matematica = AVA.Matematica
8 and ALU.Geografia = AVA.Geografia
9 /NOME RESULTADO HIS MAT GEO
João APROVADO Sim Sim Sim
SQL>
===>> Blz ???? Não tem NADA vezes NADA, ABSOLUTAMENTE NADA a ver com CASE nem com nada assim : pra vc fazer JOIN entre tabelas, vc TEM que saber quais são as colunas que se Repetem em todas as tabelas , Tem que saber o RELACIONAMENTO numa palavra… O banco é RELACIONAL não à toa…
[]s
Chiappa
25 de julho de 2016 às 8:55 pm #108314José Laurindo ChiappaModeradorUm detalhe adicional, que é meio óbvio mas talvez te escape : se vc quiser ter filtros adicionais vc os inclui no WHERE , e como no meu caso estou usando a sintaxe de join nativa do Oracle (ie, informando os relacionamentos diretamente no WHERE ao invés de usar uma keyword JOIN) então num caso em que eu tenha filtros E relacionamentos a indicar, usando a sintaxe Oracle tudo fica incluso no WHERE : por exemplo, vc queria saber o status do aluno JOÃO, informe isso como filtro :
SQL> select ALU.nome, AVA.resultado, AVA.Historia, AVA.Matematica, AVA.Geografia
2 from ALUNO ALU, AVALIACAO AVA
3 where ALU.NOME = ‘João’
4 and AVA.Historia = ‘Sim’
5 and AVA.Matematica = ‘Sim’
6 and AVA.Geografia = ‘Sim’
7 and ALU.historia = AVA.historia
8 and ALU.Matematica = AVA.Matematica
9* and ALU.Geografia = AVA.Geografia;NOME RESULTADO HIS MAT GEO
——————– ———- — — —
João APROVADO Sim Sim Sim==> vc quer saber se o José teve Aprovação, informe José como condição de filtro :
SQL> select ALU.nome, AVA.resultado, AVA.Historia, AVA.Matematica, AVA.Geografia
2 from ALUNO ALU, AVALIACAO AVA
3 where ALU.NOME = ‘José’
4 and AVA.Historia = ‘Sim’
5 and AVA.Matematica = ‘Sim’
6 and AVA.Geografia = ‘Sim’
7 and ALU.historia = AVA.historia
8 and ALU.Matematica = AVA.Matematica
9* and ALU.Geografia = AVA.Geografia;no rows selected
SQL>
==> okdoc ?? Evidentemente, é tarefa do teu Aplicativo formatar a informação, por exemplo dando uma mensagem mais amigável quando dados não são encontrados (que no nosso exemplo significa que Não havia Aprovação, o Aluno foi reprovado), formatando números e datas, enfim, fazendo a Interface entre o banco de dados e o usuário final…. DE JEITO NENHUM, se o teu Objetivo é funcionamento amigável ao usuário, vc retorna pra ele os dados tal qual o banco de dados os envia….
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.