"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Uma junção interna substitui a inclusão de valores nulos de uma junção externa?

Uma junção interna substitui a inclusão de valores nulos de uma junção externa?

Postado em 2025-03-13
Navegar:728

Does an INNER JOIN Override an OUTER JOIN's Inclusion of NULL Values?

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.

Tutorial mais recente Mais>

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