Inner join ou subconsulta. Qual usar?

15/06/2009

Oi.

Qual a diferença entre uma subconsulta e um inner join? Por exemplo:


select nome_filme from filme where cod_filme in (select cod_filme from locacao)

ou

select f.nome_filme from filme f, locacao l where f.cod_filme = l.cod_filme

ou

select f.nome_filme from filme f inner join locacao l on f.cod_filme = l.cod_filme


Rsaforuns

Respostas

16/06/2009

Jair Bg

1º caso, CONSULTA sem nenhum relacionamento, a CONSULTA pega todos os registros da ENTIDADE ´filme´, em que o ATRIBUTO ´código do filme´ exista na ENTIDADE ´locação´, porém não retornará os registros da ENTIDADE ´locação´;
2º caso, CONSULTA dos registros não relacionados entre as ENTIDADES ´filmes´ e ´locação´ porém deva retornar apenas os registros em que o ´código do filme´ sejam iguais;
3º caso, CONSULTA com relacionamento entre as ENTIDADES ´filme´ e ´locação´ onde os registros da ENTIDADE ´locação´ devem ser iguais ao ATRIBUTO ´código do filme´ na ENTIDADE ´filme´.


Responder Citar

17/06/2009

Rsaforuns

Mas estas 3 consultas, retornam exatamente a mesma coisa. O que quero compreender qual seria a mais correta, ou se não tem uma ´mais correta´.


Responder Citar

17/06/2009

Emerson

as três consultas NÃO RETORNAM a mesma coisa.

1a. consulta
[i:23e7a82d86]select nome_filme from filme
where cod_filme in (select cod_filme from locacao)[/i:23e7a82d86]
retorna SOMENTE os dados da tabela filme, para os filmes que já foram locados. retorna somente 1 registro por filme.

2a. consulta
[i:23e7a82d86]select f.nome_filme from filme f, locacao l
where f.cod_filme = l.cod_filme[/i:23e7a82d86]
retorna dados da tabela filme e da tabela locacao, para os filmes que já foram locados. o número de registros retornados será igual ao número de locações que o filme sofreu.

3a. consulta
[i:23e7a82d86]select f.nome_filme from filme f
inner join locacao l on f.cod_filme = l.cod_filme[/i:23e7a82d86]
idem à 2a, porém esteticamente melhor (gosto pessoal)

não tem mais correta. depende da sua necessidade.
- se você precisa saber quais filmes já foram locados, use a 1a forma.
- se você quer saber quais filmes já foram locados e as datas, clientes e demais dados de cada locação, use a segunda ou a terceira forma (eu prefiro a terceira)


Responder Citar

17/06/2009

Rsaforuns

Valeu pelas informações.

Eu falei que as 3 consultas retornavam a mesma coisa, pois no meu teste foi o que aconteceu.

Estou usando o sql server 2000


Responder Citar

17/06/2009

Emerson

troque o
select [b:30d713a85b]nome_filme[/b:30d713a85b]
e o
select [b:30d713a85b]f.nome_filme[/b:30d713a85b]

por
select [b:30d713a85b]*[/b:30d713a85b]

e veja o que acontece...


Responder Citar