Entendendo a interação de junções interna e externa em sql
As consultas SQL complexas freqüentemente empregam várias operações de junção, combinando diferentes tipos de junção. Uma consideração importante é como a inclusão de valores nulos, uma característica das junções externas, é afetada quando uma junção interna é posteriormente aplicada.
como as junções internas podem afetar os resultados da junção externa
uma junção interna, por sua natureza, retorna apenas linhas onde a condição de junção é atendida em ambas tabelas. Se uma junção interna seguir uma junção externa, e a condição da junção interna depende de colunas que podem ser nulas (devido à junção externa), ela efetivamente filtra linhas onde essas colunas são nulas. Isso nega a inclusão de valores nulos que a junção externa forneceu inicialmente.
exemplo ilustrativo
Vamos examinar um cenário:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;
O Left Join
garante que todas as linhas da tabela
estejam incluídas, mesmo que não haja entrada correspondente no endereço
. No entanto, o inner Junção
com email
restringe os resultados apenas para as linhas onde um correspondente email_id
existe em ambos pessoa
e e -mails
. Linhas de pessoa
que tinha um endereço correspondente
, mas um null email_id
será excluído.
um cenário problemático e sua solução
Considere esta consulta:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;
aqui, o inner junção
com city
assume que endereço.city_id
nunca é nulo. Se alguns endereços não possuem um city_id
, essas linhas (e associadas pessoa
linhas) serão omitidas, alterando involuntariamente os resultados do inicial Left Join
.
A abordagem correta é usar outro esquerda junção
em vez do inner Junção
:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;
Isso preserva a inclusão dos casos inicial letra
, lidando com os casos corretamente em que endereço.city_id
pode ser nulo. Isso garante que todos os registros de
sejam incluídos, independentemente de terem um endereço ou uma cidade associada a eles.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3