Pular para o conteúdo
  • Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 8 anos, 4 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #108309
    Avatar de JorgeJorge
    Participante

      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ão

      Tabela 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ão

      Bom 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?

      #108310
      Avatar de Paulo WerneckPaulo Werneck
      Participante

        Cara 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.

        #108313
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Colega, 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ão

          SQL> 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ão

          6 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

          #108314
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Um 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

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress