Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Necessidade de JOIN com as tabelas secao e exercício

Ao fazer o exercício, percebi que se pode obter os mesmos resultados sem a necessidade do JOIN com as tabelas exercicio e secao.

Gostaria de saber até que em ponto isso afetaria. Por exemplo, existe algum caso que isso poderia causar algum problema futuramente?

Obrigado desde já!

select a.nome, c.nome,  avg(n.nota) as mediaNota from nota n
join resposta r on r.id = n.resposta_id
--join exercicio e on e.id = r.exercicio_id
--join secao s on s.id = e.secao_id
join aluno a on a.id = r.aluno_id
join matricula m on m.aluno_id = a.id
join curso c on c.id = m.curso_id

group by a.nome, c.nome
7 respostas

Você pode usar queries no padrão ANSI 89 ou ANSI 92. De acordo com o livro "SQL Performance Tuning" de Peter Gulutzan e Trudy Pelzer não há diferenças entre o uso dos dois padrões. Nas faculdades e em cursos técnicos geralmente são ensinados o ANSI 92 devido a sua flexibilidade e por ser mais legível.

Um exemplo simples dos dois padrões.

Exemplo ANSI 89

select a.id, b.id, b.EnderecoCompleto
from pessoa a, endereco b
where a.id = b.id

Exemplo Ansi 92

select a.id, b.id, b.EnderecoCompleto
from pessoa a
inner join endereco b on a.id = b.id

De forma resumida, o uso de um padrão ou de outro é questão de gosto pessoal, apesar do Ansi 92 ser a evolução do Ansi 89, ainda há muitos profissionais que utilizam esse padrão sem nenhum tipo de prejuízo.

Olá.

Robson, acho que a pergunta dele foi mais em questão da necessidade de utilizar o JOIN em duas tabelas, sendo que sem esse JOIN o resultado está sendo o mesmo.

Bom Henrique, a resposta é sim, poderia sim causar problemas futuramente, mas isso sempre depende do que você quer trazer.

Imagine uma tabela chamada Livro que contenha as colunas ID, Nome e AutorID, e outra tabela chamada Autor, com as colunas ID e Nome. Vamos pensar no INNER JOIN entre elas, onde eu quero buscar apenas o nome dos autores:

SELECT a.Nome AS 'Nome do Autor'
FROM Autor AS a INNER JOIN Livro AS l
ON (a.ID = l.AutorID)

Você aprendeu que quando fazemos um SELECT com INNER JOIN entre as tabelas, se não especificarmos as colunas, a busca vai retornar todas as colunas de tabelas as tabelas que estiverem fazendo INNER JOIN. Entretanto, o INNER JOIN serve justamente para trazermos registros que estejam atrelados através das tabelas. No exemplo que eu dei acima, quero retornar nomes de autores, porém não quero simplesmente o nome de todos autores, pois se fosse isso eu dava só um SELECT na tabela Autor. O que eu quis com essa query com INNER JOIN foi trazer todos os autores que tenham livros publicados. Ali no "ON (a.ID = l.AutorID)" eu defini isso. Ou seja, se algum autor não tiver livro publicado, seu nome não será retornado na busca e, em muitos casos, é exatamente isso que você quer.

No caso do seu exercício o resultado continua sendo o mesmo porque, além de você não buscar nenhuma coluna das tabelas que retirou, os registros que você associou no INNER JOIN com cada tabela estão corretos. Ou seja, nesse INNER JOIN ...

join exercicio e on e.id = r.exercicio_id

... você só traz registros quando os IDs dos exercícios existirem na coluna "exercicio_id" da tabela de respostas. Como eles sempre existem, no INNER JOIN sempre retorna eles. Sem o INNER JOIN, também retornará. Agora, se você tirar o ID de um exercício válido lá da coluna "exercicio_id", na tabela resposta (pode ter mais de uma ocorrência, teria que tirar as ocorrências), vai ver que ele não será mais retornado.

[]'s.

Opa,

Primeiramente valeu Robson. Apesar de não ser exatamente minha dúvida, não sabia dessa informação e é sempre bom entender as coisas. Vou colocar esse livro na minha fila de leituras.

Bruno, valeu mesmo, tinha entendido essa parte =). Queria entender se isso em um caso real poderia afetar o resultado. Por exemplo, no caso das respostas acima, não haveria uma necessidade. A única hipótese que consegui pensar é no caso de conter exercícios que não estejam associados à uma seção, por exemplo. Por isso coloquei a dúvida no fórum, para ver não estava conseguindo enxergar alguma coisa que alguém poderia... Mas obrigado pela explicação cara, me ajudou a fixar ainda mais os conceitos!

solução!

Opa Henrique. Desculpe se não fui muito claro, mas é exatamente isso que quis responder. Em um caso real afeta o resultado sim. Pensa que as tabelas não param de ser alimentadas por novos dados e quando tiver exercícios não associados à seções, ou respostas sem exercícios associados, esses registros não serão retornados .

Bruno, relaxa, foi claro sim cara! Era mais uma curiosidade minha mesmo. Às vezes tem algo que não consegui visualizar no problema ou alguma situação. Por isso postei, você me deu uns insights legais só nessa conversa :D

Então na verdade, o select sem o JOIN com secao/exercicio seria mais correto né?

Porque como não é exatamente uma FK obrigatória, ela não traria essas linhas.

Valeu novamente a discussão cara!

Valeu você, sempre produtivas essas discussões.

Então, o SELECT sem os JOINs ali é o correto caso você não queira que retorne os registros apenas se as associações daqueles JOINs forem verdadeiras. Ou seja, se não quer trazer os dados se os exercícios não estiverem associados à uma seção...

Bom dia, Henrique.

Eu sinto que você ainda não tirou totalmente suas dúvidas, né?

Enfim, você pode dar uma olhada nesse link?

http://www.w3schools.com/sql/sql_join_inner.asp

Analisando as tabelas "Customers" e "Orders", sabe me dizer quais CustomerName e OrderID serão retornados caso eu execute o comando a seguir?

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID;