SQL - INNER JOIN VS WHERE IN

FBUR 15/12/2015 15:19:44
#455193
Boa tarde!

Eu tenho uma tabela (tbl_pessoas1) com 600.000 registros e uma tabela (tbl_pessoas2) com 7000 registros.

Gostaria de retornar apenas o que há em comum com entre elas. Fiz duas consultas:

Obs: os codigos, nomes e idades se repetem em ambas as tabelas

--- consulta 1:
SELECT codigo,nome,idade FROM tbl_pessoas1
INNER JOIN tbl_pessoas2
ON tbl_pessoas1.codigo = tbl_pessoas2.codigo
AND tbl_pessoas1.nome = tbl_pessoas2.nome
AND tbl_pessoas1.idade = tbl_pessoas2.idade

--- consulta 2:
SELECT codigo,nome,idade FROM tbl_pessoas1
WHERE codigo IN ( SELECT codigo FROM tbl_pessoas2)
AND nome IN (SELECT nome FROM tbl_pessoas2)
AND idade IN (SELECT idade FROM tbl_pessoas2)

A consulta 1, acho que é a correta. Pois retorna o que há em comum com entre a tbl_pessoas1 e tbl_pessoas2

A consulta 2 retorna os códigos, nomes e idades que existirem na tbl_pessoas2, mesmo que não sejam equivalentes à tbl_pessoas1.
Ex: Se a busca for: 874,fulano,22 na tbl_pessoas1

e na tbl_pessoas2 existirem:
874,zeca,25
415,fulano,33
633,juca,22
874,fulano,22
Aí essa consulta2 irá retornar 4 registros, sendo que deveria retornar somente o último.

é isso mesmo?

Abs.
JABA 15/12/2015 15:48:32
#455194
COM WHERE:

SELECT codigo,nome,idade FROM tbl_pessoas1, tbl_pessoas2 
WHERE tbl_pessoas1.codigo = tbl_pessoas2.codigo
AND tbl_pessoas1.nome = tbl_pessoas2.nome
AND tbl_pessoas1.idade = tbl_pessoas2.idade
FBUR 15/12/2015 16:29:20
#455196
Entendi. Obrigado pela SQL.

Mas também gostaria de saber se essa consulta 2 iria retornar mesmo o que citei abaixo dela.

Abs.
JABA 15/12/2015 17:10:09
#455202
Você quer saber se essas duas consultas produzem o mesmo resultado, é isso?

Se for, acho que não produzem. E mesmo que produzissem, creio que seria muito mais lenta do que a primeira.
XLEGENDARY 15/12/2015 18:07:24
#455207
Usava-se muito where no lugar de join numa epoca em que o join ou não era tão conhecido ou nem existia ainda
em uma época muito remota diga-se de passagem rs

o join facilita muito a vida, porém deve-se ser sempre usado com cautela, pois, ou ele dará lentidão ao seu banco se mal construido ou vc se perderá na sua query ( quando ela é gigantesca )
dai pessoas acabam usando views ( particularmente não gosto ) mas não é ruim também.
Não use o where como o join, além de ser péssimo em performance em comparação um a outro, estéticamente também fica horrivel hauahauhauha
ACCIOLLY 20/12/2015 10:22:37
#455348
Só por curiosidade, por que ter no mesmo banco duas entidades com os mesmos atributos?
FBUR 21/12/2015 11:17:21
#455375
é apenas um exemplo, o caso real é muito mais complexo. São informações repetidas de dados fiscais. Na tabela1 tem 600.000 registros e tabela2 tem 7000. O objetivo é identificar quais os registros que existem na tabela2 que também existem na tabela1.

A dúvida era se a SQL com WHERE produziria o mesmo efeito da INNJER JOIN. Mas não produz, visto que ela retorna linhas que possuam qualquer uma das condições, mesmo se não possuir as três condições, o que não é o que desejo. Ao passo que com INNER JOIN, retorna as linhas que tiverem as condições informadas.

Abs.
Tópico encerrado , respostas não são mais permitidas