Array
(
)

Inner join ou subconsulta. Qual usar?

Rsaforuns
   - 15 jun 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

Jair Bg
   - 16 jun 2009

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

Rsaforuns
   - 17 jun 2009

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

Emerson
   - 17 jun 2009

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

1a. consulta
select nome_filme from filme
where cod_filme in (select cod_filme from locacao)

retorna SOMENTE os dados da tabela filme, para os filmes que já foram locados. retorna somente 1 registro por filme.

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

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
select f.nome_filme from filme f
inner join locacao l on f.cod_filme = l.cod_filme

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)

Rsaforuns
   - 17 jun 2009

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

Emerson
   - 17 jun 2009

troque o
select nome_filme
e o
select f.nome_filme

por
select *

e veja o que acontece...